验证码是当下系统安全登录的一种验证方式,下面我将图片验证码的写法分享到这里,供大家参
**
验证码工具类**
package com.zy.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class YzmUtil {
public static void CreateYZM(HttpServletRequest request,HttpServletResponse response) throws IOException{
//定义字符串记录验证码信息
String yzm="";
String yzms="1234567980abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// *1 准备画布
//创建一个缓冲区 作为画布
BufferedImage bi=new BufferedImage(100, 38, 1);//200宽 60 高 1图片类型
// *2 获取画笔
Graphics2D g=(Graphics2D)bi.getGraphics();
// *3 绘制背景
//设置背景颜色
g.setColor(Color.white);
g.fillRect(1, 1, 156, 38);
// *4绘制图案
//设置字体
Font font=new Font(null, Font.BOLD, 22);//第一个参数 字体样式 第二个参数 加粗/斜体 第三个 字体大小
g.setFont(font);//把字体和画笔关联
//写字
//设置字体颜色
for (int i = 0; i < 4; i++) {
//随机下标
int index=(int)(Math.random()*yzms.length());
//随机字符
char c=yzms.charAt(index);
yzm+=c;
//随机颜色
Color color=getColor();
g.setColor(color);
//写字
g.drawString(c+"", 24*i, 26);//第一次参数 写的内容 第二三个参数是字体的坐标
//随机线颜色
color=getColor();
g.setColor(color);
//划线
g.drawLine(0, (int)(Math.random()*28), 160, (int)(Math.random()*28));
}
//把验证码添加到域中
System.out.println("验证码:"+yzm);
request.getSession().setAttribute("yzm", yzm);
//获取response的输出流
OutputStream out=response.getOutputStream();
//通过ImageIO的write方法 把缓冲区中的数据 写到目的文件中
ImageIO.write(bi, "JPEG", out);
}
public static Color getColor() {
int a1=(int)(Math.random()*100+120);
int a2=(int)(Math.random()*100+120);
int a3=(int)(Math.random()*100+120);
return new Color(a1, a2, a3);
}
}
在控制层调用
//这个方法是调用验证码工具类产生一个验证码
@RequestMapping("/login/getYzm")
public void getYzm(HttpServletRequest request,HttpServletResponse response){
try {
YzmUtil.CreateYZM(request, response);
} catch (IOException e) {
e.printStackTrace();
}
}
//这个方法是获取session中的验证码并返回到前台页面
@RequestMapping("/login/getSessionYzm")
@ResponseBody
public Map<String,Object> getSessionYzm(HttpSession session){
Map<String,Object> map = new HashMap<>();
map.put("yzm", session.getAttribute("yzm"));
return map;
}
**
在前台页面直接通过路径访问就可以了
**
<img id="img" alt="验证码失效" title="点击换一张" src="<%=path%>/login/getYzm.do" onclick="up()">
<script type="text/javascript">
setyzm(); //刚进来的时候先获取session中的验证码,以便登录的时候做验证
//前台展示的只是一张图片,这里将后台装入session的yzm获取方便登录的时候与前台输入的做比较
function setyzm(){
$.ajax({
url:"<%=path%>/login/getSessionYzm.do",
type:"post",
dataType:"json",
success:function(data){
yzm = data.yzm;
document.getElementById("yyy").value=yzm;
}
});
}
//这个方法是点击更新验证码或者当输入的验证码与session中的验证码不匹配时重新获取验证码
function up(){
var date = new Date();
$("#img").attr("src","<%=path%>/login/getYzm.do?date="+date);
setyzm();
}
</script>