JavaWeb 登录界面验证码的生成过程
第一步 : 生成随机字符串(准备作画)
Random r =new Random ();
//获取随机字符串
private String getRandomStr(){
String str="23456789ABCDEFGHIGKMNPQSTUVWXYZabcdefghgklmnpqstuvwxyz";
//StringBuilder叫字符串缓存区对象,使用时可以不断添加字符、字符串等已有内容。
//需要使用时调用toString()获得对象里的所有字符串。
StringBuilder sb = new StringBuilder();
for(int i=0 ;i<4;i++)
{
int index =r.nextInt(str.length());
char letter =str.charAt(index);
sb.append(letter);
}
return sb.toString();
}
第二步: 生成随机的背景和前景色(准备画的色调)
//获取随机的背景颜色
public Color getBackColor(){
int red =r.nextInt(256);
int green =r.nextInt(256);
int blue =r.nextInt(256);
return new Color(red,green,blue);
}
//前景颜色和背景颜色要反差大所以我们的颜色需要相减
public Color getForeColor(Color bgColor){
int red =255-bgColor.getRed();
int green = 255-bgColor.getGreen();
int blue =255-bgColor.getBlue();
return new Color(red,green,blue);
}
第三步 构建图片内存 →拿到内存图片的画布→设置背景颜色(准备画纸和开始作画)
→设置填充长方形→设置前景色和字体→画上随机字符串→设置噪点颜色画上噪点
1.设置响应格式为图片.jpg
2.创建一个不带透明色的对象 图片对象 三原色
3.获取画布对象
4.设置背景颜色
5.画背景
6.设置前景色
7.设置字体
8.将随机字符串存到session
9.画
10.画噪点 干扰
11.将图片输出到响应流
12.把图片写到输出流区
注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
因为验证码需要我们打开网页时就显示 所以说它的跟随服务器的启动而生成 不能 调用请求的时候在执行 所以需要在配置文件中加上
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应格式为图片.jpg
resp.setContentType("image/jpeg");
//创建一个不带透明色的对象 图片对象 三原色
BufferedImage bufferedImage= new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
//获取画布对象
Graphics g = bufferedImage.getGraphics();
//设置背景颜色
Color bgColor =getBackColor();
g.setColor(bgColor);
//画背景
g.fillRect(0, 0, 80,30);
//设置前景色
Color foreColor =getForeColor(bgColor);
g.setColor(foreColor);
//设置字体
g.setFont(new Font("黑体",Font.BOLD,26));
//将随机字符串存到session
String randomStr =getRandomStr();
HttpSession session = req.getSession();
session.setAttribute("code", randomStr);
//画
g.drawString(randomStr, 10, 28);
//画噪点 干扰
for(int i =0;i<30;i++)
{
g.setColor(Color.white);
int x = r.nextInt(80);
int y= r.nextInt(30);
g.fillRect(x, y, 1, 1);
}
//将图片输出到响应流
ServletOutputStream sos = resp.getOutputStream();
//把图片写到输出流区
ImageIO.write(bufferedImage, "jpeg", sos);
}
在UserServlet判断验证码是否正确
System.out.println(session.getAttribute("code"));
//2.2 提取session中的验证码,进行判断
String code =session.getAttribute("code").toString();
//不区分大小写
if(!code.equalsIgnoreCase(userCode)){
out.println("<script>alert('验证码输入错误');location.href = 'login.html';</script>");
return;
}
点击图片切换验证码
<script type="text/javascript">
function Change() {
var img = document.getElementById("img")
//设置时间戳
var date = new Date().getTime();
img.src="codeServlet?"+date;
}
</script>
<img src="codeServlet" id="img" onclick="Change();"/>