java session验证码_JavaWeb 使用Session实现一次性验证码功能

该博客介绍了如何在JavaWeb中使用Session实现一次性验证码功能。通过`GetCodeServlet`生成并显示验证码,将其存储在Session中,然后在`LoginServlet`中验证用户输入的验证码,实现验证码的校验。代码示例详细展示了验证码的生成、存储、比较和不区分大小写的处理方法。
摘要由CSDN通过智能技术生成

表单

请输入验证码:

getCodeServlet

提交

载入页面时,会自动请求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);

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

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();

总结

以上所述是小编给大家介绍的JavaWeb 使用Session实现一次性验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值