java画布验证码
1.java代码:
package com.xmx.util;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
/**
* @Auther: 郑兴源
* @DateTime : 2021-11-22 上午 09:53
* @descriptoin:
*/
@WebServlet("/resultNub")
public class ResultNubUtil extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 在内内存中申请 一块画布
BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_BGR);
//2 得到画布笔
Graphics g = image.getGraphics();
//3设置颜色
g.setColor(new Color(255, 255, 255));
//4设置背景颜色
g.fillRect(0, 0, 80, 30);
//5给画笔设置颜色
Random r = new Random();
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//6设置字符
g.setFont(new Font(null, Font.ITALIC, 24));
//7定义一个随即数组
char[] cc = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
//8验证码的随机
String number = "";
for (int i = 0; i < 5; i++) {
number += String.valueOf(cc[r.nextInt(cc.length)]);
}
//存验证码在服务器
HttpSession session = req.getSession();
session.setAttribute("trueyzm", number);//用于与表单德剧比较
//9画在背景上
g.drawString(number, 5, 26);
//10.1划线干扰
for (int i = 0; i < 7; i++) {
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
// 10.2画线
g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r.nextInt(30));
}
/**
* 压缩图片 输出
*/
resp.setContentType("image/jpeg");
// 获取输出流
OutputStream os = resp.getOutputStream();
// 用流写出
javax.imageio.ImageIO.write(image, "jpeg", os);
os.close();
}
}
验证码效果:
2.html前端
<form class="form-signin" id="path" method="post">
<h2 class="form-signin-heading" style="text-align: center; color: darkorchid;">登入界面</h2>
</br>
<p>账户<input type="text" name="userid" id="inputEmail" class="form-control" placeholder="请输入账号" required
autofocus></p>
<p>密码<input type="password" name="userpwd" id="inputPassword" class="form-control" placeholder="请输入账号密码"
required></p>
<p>验证: <input type="text" class="inputgri" name="number"/>
<img id="num" src="resultNub"><a
href="javascript:" onclick="document.getElementById('num').src = 'resultNub?'+(new Date()).getTime()">看不清</a>
</p>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> 记住密码
<select id="type">
<option value="0">请选登入用户类型</option>
<option value="1">用户</option>
<option value="2" selected>管理员</option>
</select>
</label>
</div>
<!-- type="submit"-->
<button class="btn btn-lg btn-primary btn-block" onclick="getPath()">Sign in</button>
</form>
注意:
<p>验证: <input type="text" class="inputgri" name="number"/>
<img id="num" src="resultNub">
<a href="javascript:" onclick="document.getElementById('num').src = 'resultNub?'+(new Date()).getTime()">看不清</a>
</p>
img 的src 是 httpservlet 的路径(这里是:@WebServlet("/resultNub"))
用来切换图片(得加一个时间):οnclick="document.getElementById(‘num’).src = ‘resultNub?’+(new Date()).getTime()
3.servlet:处理
package com.xmx.util;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther:
* @DateTime : 2021-11-22 上午 10:55
* @descriptoin:
*/
public class Login extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("userid");
String pwd = req.getParameter("userpwd");
//验证码
String number = req.getParameter("number").trim();
System.out.println(number);
HttpSession session = req.getSession();
// session.setAttribute("name", name);
String trueyzm = session.getAttribute("trueyzm").toString();
System.out.println("Getsession:" + trueyzm);
// if (number.equalsIgnoreCase(trueyzm) && service.adminLogin(name, pwd) > 0)
if (number.equalsIgnoreCase(trueyzm) ) {
//忽略大小写
System.out.println("管理员登入成功.....");
resp.sendRedirect("/fitness/adminMenu.html");
// req.getRequestDispatcher("/fitness/fitness/admin/adminMenu.html").forward(req, resp);
} else {
System.out.println("管理员登入失败.....");
resp.sendRedirect("/fitness/index.html");
}
}
}