JavaWeb 使用Session实现一次性验证码功能

网友投稿 299 2022-12-29


JavaWeb 使用Session实现一次性验证码功能

表单

请输入验证码:


载入页面时,会自动请求getCodeServlet,获取图片(验证码)。

getCodeServlet,产生验证码

@WebServlet("/getCodeServlet")

public class GetCodeServlet extends HttpServlet {

//验证码的宽、高

private static int WIDTH=80;

private static int HEIGHT=25;

//绘制背景

private void drawBg(Graphics g){

//rgb

g.setColor(new Color(128, 128, 128));

//绘制矩形。x,y,wigth,height

g.fillRect(0,0,WIDTH,HEIGHT);

//随机绘制100个干扰点

Random random=new Random();

for (int i=0;i<100;i++){

//产生(0,1)上的小数,*WIDTH|HEIGHT,再取整也行

int x=random.nextInt(WIDTH);

int y=random.nextInt(HEIGHT);

g.drawOval(x,y,1,1);

//干扰点的颜色也可以随机,随机产生red,green,blue即可

//g.setColor(new Color(red,green,blue));

}

}

//绘制验证码

private void drawCode(Graphics g,char[] code){

g.setColor(Color.BLACK);

//字体、http://样式(多个时竖线分隔)、字号

g.setFont(new Font("serif",Font.ITALIC|Font.BOLD,18));

//在不同位置绘制验证码字符,参数:要绘制的String、横、纵坐标。+""是为了char转String。

g.drawString(code[0]+"",1,17);

g.drawString(code[1]+"",16,15);

g.drawString(code[2]+"",31,18);

g.drawString(code[3]+"",46,16);

}

//随机产生4位验证码

private char[] getCode(){

String chars="0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";

char[] code=new char[4];

Random random=new Random();

for (int i=0;i<4;i++){

//[0,62)

int index= random.nextInt(62);

code[i]=chars.charAt(index);

}

return code;

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

HttpSession session = request.getSession();

ServletOutputStream sos = response.getOutputStream();

response.setContentType("image/jpeg");

//设置浏览器不缓存此图片

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires",0);

//创建内存图片

BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, TYPE_INT_RGB);

Graphics g= bufferedImage.getGraphics();

char[] code=getCode();

//将验证码放到session域中。session对象要在提交响应之前获得

session.setAttribute("code",new String(code));

drawBg(g);

drawCode(g,code);

g.dispose();

//将图片输出到浏览器

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ImageIO.write(bufferedImage,"JPEG",baos);

baos.writeTo(sos);

baos.close();

sos.close();

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

doPost(request,response);

}

}

loginServlet,处理表单

@WebServlet("/loginServlet")

public class LoginServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

HttpSession session = request.getSession();

String trueCode= (String) session.getAttribute("code");

String code=request.getParameter("code");

if (code.equals(trueCode)){

response.getWriter().write("验证码正确");

}

else {

response.getWriter().write("验证码错误");

}

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request,response);

}

}

上面的处理方式要区分验证码的大小写。

不区分大小写:

//先转换为全大写|全小写,再判断

trueCode=trueCode.toLowerCase();

code=code.toLowerCase();

//trueCode=trueCode.toUpperCase();

//code=trueCode.toUpperCase();

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微服务网关做权限验证(微服务 权限验证)
下一篇:什么是app接口测试工具(什么是app接口测试工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~