文档章节

jsp中生成的验证码和存在session里面的验证码不一致的处理

期待变强的菜鸟
 期待变强的菜鸟
发布于 2014/05/20 16:39
字数 717
阅读 1280
收藏 10

下面直接附上我的例子:

截图如下:



代码如下:

1.JAVA类:CodeServlet.java:

[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1. package cn.gov.csrc.servlet;  

  2.   

  3. import java.awt.Color;  

  4. import java.awt.Font;  

  5. import java.awt.Graphics;  

  6. import java.awt.image.BufferedImage;  

  7. import java.io.IOException;  

  8. import java.util.Random;  

  9.   

  10. import javax.servlet.ServletException;  

  11. import javax.servlet.http.HttpServlet;  

  12. import javax.servlet.http.HttpServletRequest;  

  13. import javax.servlet.http.HttpServletResponse;  

  14.   

  15. import com.sun.image.codec.jpeg.JPEGCodec;  

  16. import com.sun.image.codec.jpeg.JPEGImageEncoder;  

  17.   

  18. public class CodeServlet extends HttpServlet {  

  19.   

  20.     /** 

  21.      * 产生验证码图片 

  22.      */  

  23.     public void doGet(HttpServletRequest request, HttpServletResponse response)  

  24.             throws ServletException, IOException {  

  25.         response.setContentType("image/jpeg");  

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

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

  28.         response.setDateHeader("Expires", 0L);  

  29.         int width = 80;  

  30.         int height = 30;  

  31.         BufferedImage image = new BufferedImage(width, height, 1);  

  32.         Graphics g = image.getGraphics();  

  33.         Random random = new Random();  

  34.         g.setColor(getRandColor(200250));  

  35.         g.fillRect(00, width, height);  

  36.         g.setFont(new Font("Arial"025));  

  37.         g.setColor(getRandColor(160200));  

  38.         for (int i = 0; i < 155; i++) {  

  39.             int x = random.nextInt(width + 100);  

  40.             int y = random.nextInt(height + 100);  

  41.             int xl = random.nextInt(10);  

  42.             int yl = random.nextInt(12);  

  43.             g.drawOval(x, y, x + xl, y + yl);  

  44.         }  

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

  46.         String sRand = code;  

  47.         for (int i = 0; i < sRand.length(); i++) {  

  48.             String rand = sRand.substring(i, i + 1);  

  49.             g.setColor(new Color(20 + random.nextInt(110), 20 + random  

  50.                     .nextInt(110), 20 + random.nextInt(110)));  

  51.             g.drawString(rand, 14 * i + 525);  

  52.         }  

  53.         g.dispose();  

  54.         javax.servlet.ServletOutputStream imageOut = response.getOutputStream();  

  55.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(imageOut);  

  56.         encoder.encode(image);  

  57.     }  

  58.   

  59.     private Color getRandColor(int fc, int bc) {  

  60.         Random random = new Random();  

  61.         if (fc > 255)  

  62.             fc = 255;  

  63.         if (bc > 255)  

  64.             bc = 255;  

  65.         int r = fc + random.nextInt(bc - fc);  

  66.         int g = fc + random.nextInt(bc - fc);  

  67.         int b = fc + random.nextInt(bc - fc);  

  68.         return new Color(r, g, b);  

  69.     }  

  70.   

  71. }  




2.Web.xml文件:

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  

  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   

  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  

  6.     <display-name></display-name>  

  7.     <welcome-file-list>  

  8.         <welcome-file>index.jsp</welcome-file>  

  9.     </welcome-file-list>  

  10.     <servlet>  

  11.         <servlet-name>CodeServlet</servlet-name>  

  12.         <servlet-class>cn.gov.csrc.servlet.CodeServlet</servlet-class>  

  13.     </servlet>  

  14.     <servlet-mapping>  

  15.         <servlet-name>CodeServlet</servlet-name>  

  16.         <url-pattern>/CodeServlet</url-pattern>  

  17.     </servlet-mapping>  

  18. </web-app>  


3.index.jsp:

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

  2. <%  

  3.     String path = request.getContextPath();  

  4.     String basePath = request.getScheme() + "://"  

  5.             + request.getServerName() + ":" + request.getServerPort()  

  6.             + path + "/";  

  7. %>  

  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

  9. <html>  

  10. <head>  

  11. <base href="<%=basePath%>">  

  12. <title>验证码测试</title>  

  13. <meta http-equiv="pragma" content="no-cache">  

  14. <meta http-equiv="cache-control" content="no-cache">  

  15. <meta http-equiv="expires" content="0">  

  16. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

  17. <meta http-equiv="description" content="This is my page">  

  18. <script language="javascript" type="text/javascript">  

  19. var code ; //在全局 定义验证码   

  20. function createCode(){    

  21.     code = "";    

  22.     var codeLength = 5;//验证码的长度    

  23.     //所有候选组成验证码的字符,可以用中文    

  24.     var selectChar = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C',  

  25.             'D','E','F','G','H','I','J','K','L','M','N','O','P',  

  26.             'Q','R','S','T','U','V','W','X','Y','Z','a','b','c',  

  27.             'd','e','f','g','h','i','j','k','l','m','n','o','p',  

  28.             'q','r','s','t','u','v','w','x','y','z');    

  29.     for(var i=0;i<codeLength;i++){    

  30.         var charIndex = Math.floor(Math.random()*60);    

  31.         code +=selectChar[charIndex];    

  32.     }    

  33.     return code;    

  34. }    

  35. function validate (){    

  36.     var inputCode = document.getElementById("vcode").value.toLowerCase();    

  37.     if(inputCode.length <=0){    

  38.         alert("请输入验证码!");    

  39.         return false;    

  40.     }    

  41.     else if(inputCode != code.toLowerCase()){    

  42.         alert("验证码输入错误!");    

  43.         show();//刷新验证码    

  44.         return false;    

  45.     }else{    

  46.         alert("^-^ OK");    

  47.         return true;    

  48.     }    

  49. }    

  50. function show(){    

  51.         //显示验证码    

  52.         document.getElementById("code").src="CodeServlet?code="+createCode();    

  53. }    

  54. window.onload = function() {  

  55.         //document.onload=show();    

  56.         show();//页面加载时加载验证码    

  57.         //这时无论在ie还是在firefox中,js没有加载完,页面的东西是不会被执行的;    

  58.     }    

  59. </script>  

  60. </head>  

  61.   

  62. <body>  

  63.     <form onsubmit="return validate();" action="" method="post">  

  64.         <h3>jsp+js+servlet实现验证码</h3>  

  65.         <br /> 用户名:<input type="text" name="" /><br /> 请输入验证码: <input  

  66.             type="text" id="vcode" style="width: 60;" maxLength="5" /> <img  

  67.             src="" id="code" /> <a href="#" mce_href="#"  

  68.             onclick="javascript:show();return false;">看不清,换一张!</a><br /> <input  

  69.             type="submit" />  

  70.     </form>  

  71. </body>  

  72. </html>  



© 著作权归作者所有

共有 人打赏支持
期待变强的菜鸟
粉丝 17
博文 57
码字总数 75590
作品 0
郑州
程序员
私信 提问
加载中

评论(4)

双_双
双_双
验证码的字符串要在服务端生成,客户端的一切输入都是不可靠的
双_双
双_双
我首先访问一下CodeServlet?code=1234,这时候session中已经放入1234。然后我再请求服务器,带上用户名密码,就可以暴力猜解了。
期待变强的菜鸟
期待变强的菜鸟

引用来自“e241138”的评论

验证码要在后端生成,你这种太容易伪造请求了

怎么伪造?
双_双
双_双
验证码要在后端生成,你这种太容易伪造请求了
页面上取session的值,jsp页面报错

这个是随机生成验证码的类,把生成的验证码放在了session里面,我想在jsp页面取一下session里面的值,我在jsp页面是这样写的 页面报jsp错误,不知道是啥原因 求教 这个是跑的debug...

薄暮凉年
2014/11/25
531
3
验证码SimpleCaptcha

想总结一下验证码(开源使用的验证码。当然,也可以自己去实现,不过有成熟的开源项目就用吧)的内容,然后看了几个开源项目,发现SimpleCaptcha使用比较简单,容易入手,就从它开始吧。 接触...

蘑菇街隐修
2012/12/13
0
0
Java里使用patchca生成验证码

Patchca是Piotr Piastucki写的一个java验证码开源库,打包成jar文件发布,patchca使用简单但功能强大。 本例实现了自定义背景,由于生成图片较小,波动太大时会导致部分文字显示不全,所以更...

easonwang
2014/04/14
0
0
synchronized/EasyCaptcha

EasyCaptcha JavaWeb图形验证码,支持gif验证码,可用于基于的session的web项目和前后端分离的项目。 效果展示 刷新页面可以重新生成验证码图片。 导入项目 gradle方式的引入 需要先在proje...

synchronized
2018/07/02
0
0
javaweb开发之利用session实现一次性验证码

一、一次性验证码的作用 防止暴力破解。 二、实现 1.创建jsp页面,在页面中添加一个img标签,指向一个生成图片的servlet,设置img宽度和高度 2.创建生成图形验证码的Servlet 该Servlet根据生...

小米米儿小
2013/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象继承

第1章 面向对象 1.1 知识回顾 1.Java中的数据类型 2.引用数据类型String中的方法 3.IO流_读写文件 1.2 面向对象概念回顾 什么叫面向对象编程?有人是这么理解的 也有人说不对,面向对象编程是你...

stars永恒
31分钟前
0
0
Java-深入HashMap原理及内部存储结构

本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。 public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0; i ......

小刀爱编程
46分钟前
1
0
高并发和分布式中的幂等处理

概念 抽象概念 幂等(idempotent,idempotentce)是一个数学与计算机概念,常见于抽象代数中。 在计算机概念中,就是针对一个操作,不管做多少次,产生效果或返回的结果都是一样的。 场景距...

细节探索者
47分钟前
0
0
2019年1月份最新阿里内推Java后端面试题

阿里一面题目: osi七层网络模型,五层网络模型,每次层分别有哪些协议死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决如何判断链表有环虚拟机类加载机制,双亲委派模型...

别打我会飞
今天
2
0
MIT 6.828 main.c文件分析

#include <inc/x86.h>#include <inc/elf.h> /*这是一个简单粗略的boot loader,它唯一的工作就是从硬盘的第一个扇区启动格式为ELF的内核镜像硬盘布局这个程序(包括boot.S和mai...

FeanLau
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部