java web 验证码_Java Web(四) 一次性验证码的代码实现

本文介绍了Java Web中实现一次性验证码的具体步骤,包括在login.jsp页面展示验证码图片、VerifyCodeServlet生成并存储验证码、LoginServlet验证验证码的正确性和防止重复提交。详细讲解了VerifyCodeServlet的绘图逻辑,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

其实实现代码的逻辑非常简单,真的超级超级简单。

1、在登录页面上login.jsp将验证码图片使用标签xxx将绘制验证码图片的url给它

2、在服务器端就两个servlet,一个就是用来绘制验证码图片的VerifyCodeServlet,另一个就是登录时验证验证码是否点写正确或是否重复提交的LoginServlet

3、在VerifyCodeServlet中,将验证码的四个字母存入session中,然后在LoginServlet中,将请求中提交过来的验证码与session中的进行对比,如果正确,则验证成功,并且将session中的验证码删除,为什么要删除?保证session中的数据只能被用一次,防止重复提交数据,如果不正确,就使用request,将错误信息保存,然后请求转发到登录页面显示错误信息,如果发现session中的数据为null,说明重复提交了数据,也将错误信息用同样的方法返回到登录页面。

难点就在于:VerifyCodeServlet的代码实现.对绘图的代码不是很熟悉。

login.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

out.print(msg);

}%>

用户名:
验证码: VerifyCodeServlet

View Code

VerifyCodeServlet.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//声明验证码

int width = 60;int height = 30;

String data= "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz"; //随机字符字典,其中0,o,1,I 等难辨别的字符最好不要

Random random = new Random();//随机类//1 创建图片数据缓存区域(核心类)

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个彩色的图片//2 获得画板(图片,ps图层),绘画对象。

Graphics g =image.getGraphics();//3 选择颜色,画矩形3,4步是画一个有内外边框的效果

g.setColor(Color.BLACK);

g.fillRect(0, 0, width, height);//4白色矩形

g.setColor(Color.WHITE);

g.fillRect(1, 1, width-2, height-2);/**1 提供缓存区域,为了存放4个随机字符,以便存入session*/StringBuilder builder= newStringBuilder();//5 随机生成4个字符//设置字体颜色

g.setFont(new Font("宋体", Font.BOLD&Font.ITALIC, 20));for(int i = 0 ; i < 4 ;i ++){//随机颜色

g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255)));//随机字符

int index =random.nextInt(data.length());

String str= data.substring(index, index + 1);/**2 缓存*/builder.append(str);//写入

g.drawString(str, (width / 6) * (i + 1) , 20);

}//给图中绘制噪音点,让图片不那么好辨别

for(int j=0,n=random.nextInt(100);j

g.setColor(Color.RED);

g.fillRect(random.nextInt(width),random.nextInt(height),1,1);//随机噪音点

}/**3 获得随机数据,并保存session*/String tempStr=builder.toString();

request.getSession().setAttribute("sessionCacheData",tempStr);//.. 生成图片发送到浏览器 --相当于下载

ImageIO.write(image, "jpg", response.getOutputStream());

}

View Code

LoginServlet.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//1 获得用户输入的验证码

String verifyCode = request.getParameter("verifyCode");//2 获得服务器session 存放数据 ,如果没有返回null

String sessionCacheData = (String) request.getSession().getAttribute("sessionCacheData");//*将服务器缓存session数据移除

request.getSession().removeAttribute("sessionCacheData");//** 判断服务器是否存在

if(sessionCacheData == null){

request.setAttribute("msg", "请不要重复提交");

request.getRequestDispatcher("/login.jsp").forward(request, response);return;

}//3 比较

if(!sessionCacheData.equalsIgnoreCase(verifyCode)){//用户输入错误//* 存放request作用域

request.setAttribute("msg", "验证码输入错误");//* 请求转发

request.getRequestDispatcher("/login.jsp").forward(request, response);return;

}//...... 登录操作

}public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {this.doGet(request, response);

}

}

View Code

效果图:

db6610f4eeb8e28e64a98d54ac2fc010.png

验证码错误时:

814ec502c3210cd6d644c9951e815f0f.png

注意:

如果要拷贝代码的话,需要改就应该就是那几处url,你的肯定跟我的不一样,并且有些人设置的servlet的访问路径也不一样,所以拷贝的话只需要拷贝关键代码即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值