分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

web开发(四) 一次性验证码的代码实现

发布时间:2023-09-06 01:52责任编辑:熊小新关键词:验证码

在网上看见一篇不错的文章,写的详细。

以下内容引用那篇博文。转载于《http://www.cnblogs.com/whgk/p/6426072.html》,在此仅供学习参考之用。

               

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

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

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

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

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


login.jsp

 ?<body> ???????????<% ???????String msg = (String)request.getAttribute("msg"); ???????if(msg != null){ ???????????out.print(msg); ???????} ???%> ???????<form action="/test01/LoginServlet" method="post"> ???????用户名:<input type="text" name="username" /> <br/> ???????验证码:<input type="text" name="verifyCode" size="5" /> <img src="/test01/VerifyCodeServlet" /> <br/> ???????<input type="submit" value="提交"/> ???</form> ??</body>

VerifyCodeServlet.java

 ???public void doGet(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, 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 = new StringBuilder(); ???????????????//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<n;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()); ???}

LoginServlet.java

 ???public void doGet(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, 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 void doPost(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, IOException { ???????this.doGet(request, response); ???}}

效果图:

    

    验证码错误时:

      

注意:

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

web开发(四) 一次性验证码的代码实现

原文地址:https://www.cnblogs.com/hzb462606/p/8977451.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved