分享web开发知识

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

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

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

发布时间:2023-09-06 01:42责任编辑:赖小花关键词:jsjsp验证码
???????????????????????????
???????????????????????

今天在调试项目的时候发现,在提交表单的时候的验证码有问题,问题是这样的:就是通过debug模式查看得知:jsp页面生成的验证码和表单输入的页面输入的一样,但是到后台执行的时候,你会发现他们是不一样的,现在上图看看:

1.这是表单提交的时候:


2.这是后台得到的生成的验证码:



3.这是后台得到输入的验证码:



这样的问题还是头一次出现,以前没遇到过,经过google,baidu,最后得知是这样的:因为加载jsp页面比加载session快一些


那怎么办才能解决这个办法呢,

又经过多次搜索,思考,实践,终于想出了个好办法

1.在jsp页面用js生成验证码并保存在变量中,验证码作为参数传到java(继承了HttpServlet)类


2.根据jsp页面中传过来的验证码画出一个有干扰线或干扰点的图片

3.在WEB-INF/web.xml中配置 servlet

4.在jsp页面调用配置好的servlet,一般是通过<img src="servlet名" />调用

5.提交数据之前验证

<form onsubmit="return validate();"……/>


局部刷新验证码:<a href="#" >看不清,换一张!</a>-----return false;很重要啊

下面直接附上我的例子:

截图如下:



代码如下:

1.JAVA类:CodeServlet.java:

[java] view plain copy
print?
  1. packagecn.gov.csrc.servlet;
  2. importjava.awt.Color;
  3. importjava.awt.Graphics;
  4. importjava.io.IOException;
  5. importjavax.servlet.http.HttpServlet;
  6. importjavax.servlet.http.HttpServletResponse;
  7. importcom.sun.image.codec.jpeg.JPEGCodec;
  8. *产生验证码图片
  9. publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
  10. response.setContentType("image/jpeg");
  11. response.setHeader("Pragma","No-cache");
  12. intwidth=80;
  13. BufferedImageimage=newBufferedImage(width,height,1);
  14. Randomrandom=newRandom();
  15. g.fillRect(0,0,width,height);
  16. g.setColor(getRandColor(160,200));
  17. intx=random.nextInt(width+100);
  18. intxl=random.nextInt(10);
  19. g.drawOval(x,y,x+xl,y+yl);
  20. Stringcode=request.getParameter("code");
  21. for(inti=0;i<sRand.length();i++){
  22. g.setColor(newColor(20+random.nextInt(110),20+random
  23. g.drawString(rand,14*i+5,25);
  24. g.dispose();
  25. JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(imageOut);
  26. }
  27. privateColorgetRandColor(intfc,intbc){
  28. if(fc>255)
  29. if(bc>255)
  30. intr=fc+random.nextInt(bc-fc);
  31. intb=fc+random.nextInt(bc-fc);
  32. }
  33. }
package cn.gov.csrc.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class CodeServlet extends HttpServlet { ???/** ????* 产生验证码图片 ????*/ ???public void doGet(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, IOException { ???????response.setContentType("image/jpeg"); ???????response.setHeader("Cache-Control", "no-cache"); ???????response.setHeader("Pragma", "No-cache"); ???????response.setDateHeader("Expires", 0L); ???????int width = 80; ???????int height = 30; ???????BufferedImage image = new BufferedImage(width, height, 1); ???????Graphics g = image.getGraphics(); ???????Random random = new Random(); ???????g.setColor(getRandColor(200, 250)); ???????g.fillRect(0, 0, width, height); ???????g.setFont(new Font("Arial", 0, 25)); ???????g.setColor(getRandColor(160, 200)); ???????for (int i = 0; i < 155; i++) { ???????????int x = random.nextInt(width + 100); ???????????int y = random.nextInt(height + 100); ???????????int xl = random.nextInt(10); ???????????int yl = random.nextInt(12); ???????????g.drawOval(x, y, x + xl, y + yl); ???????} ???????String code = request.getParameter("code"); ???????String sRand = code; ???????for (int i = 0; i < sRand.length(); i++) { ???????????String rand = sRand.substring(i, i + 1); ???????????g.setColor(new Color(20 + random.nextInt(110), 20 + random ???????????????????.nextInt(110), 20 + random.nextInt(110))); ???????????g.drawString(rand, 14 * i + 5, 25); ???????} ???????g.dispose(); ???????javax.servlet.ServletOutputStream imageOut = response.getOutputStream(); ???????JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(imageOut); ???????encoder.encode(image); ???} ???private Color getRandColor(int fc, int bc) { ???????Random random = new Random(); ???????if (fc > 255) ???????????fc = 255; ???????if (bc > 255) ???????????bc = 255; ???????int r = fc + random.nextInt(bc - fc); ???????int g = fc + random.nextInt(bc - fc); ???????int b = fc + random.nextInt(bc - fc); ???????return new Color(r, g, b); ???}}


2.Web.xml文件:
[html] view plain copy
print?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  4. <welcome-file-list>
  5. </welcome-file-list>
  6. <servlet-name>CodeServlet</servlet-name>
  7. </servlet>
  8. <servlet-name>CodeServlet</servlet-name>
  9. </servlet-mapping>
  10. <?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" ???xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ???xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> ???<display-name></display-name> ???<welcome-file-list> ???????<welcome-file>index.jsp</welcome-file> ???</welcome-file-list> ???<servlet> ???????<servlet-name>CodeServlet</servlet-name> ???????<servlet-class>cn.gov.csrc.servlet.CodeServlet</servlet-class> ???</servlet> ???<servlet-mapping> ???????<servlet-name>CodeServlet</servlet-name> ???????<url-pattern>/CodeServlet</url-pattern> ???</servlet-mapping></web-app>
    3.index.jsp:
    [javascript] view plain copy
    print?
    1. <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
    2. Stringpath=request.getContextPath();
    3. +request.getServerName()+":"+request.getServerPort()
    4. %>
    5. <html>
    6. <basehref="<%=basePath%>">
    7. <metahttp-equiv="pragma"content="no-cache">
    8. <metahttp-equiv="expires"content="0">
    9. <metahttp-equiv="description"content="Thisismypage">
    10. varcode;//在全局定义验证码
    11. code="";
    12. //所有候选组成验证码的字符,可以用中文
    13. ‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,
    14. ‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,
    15. for(vari=0;i<codeLength;i++){
    16. code+=selectChar[charIndex];
    17. returncode;
    18. functionvalidate(){
    19. if(inputCode.length<=0){
    20. returnfalse;
    21. elseif(inputCode!=code.toLowerCase()){
    22. show();//刷新验证码
    23. }else{
    24. returntrue;
    25. }
    26. //显示验证码
    27. }
    28. //document.onload=show();
    29. //这时无论在ie还是在firefox中,js没有加载完,页面的东西是不会被执行的;
    30. </script>
    31. <formonsubmit="returnvalidate();"action=""method="post">
    32. <br/>用户名:<inputtype="text"name=""/><br/>请输入验证码:<input
    33. src=""/><ahref="#"mce_href="#"
    34. type="submit"/>
    35. </body>
    36. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><% ???String path = request.getContextPath(); ???String basePath = request.getScheme() + "://" ???????????+ request.getServerName() + ":" + request.getServerPort() ???????????+ path + "/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>验证码测试</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><script language="javascript" type="text/javascript">var code ; //在全局 定义验证码 function createCode(){ ?????code = ""; ?????var codeLength = 5;//验证码的长度 ?????//所有候选组成验证码的字符,可以用中文 ?????var selectChar = new Array(0,1,2,3,4,5,6,7,8,9,‘A‘,‘B‘,‘C‘, ???????????‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘, ???????????‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘,‘a‘,‘b‘,‘c‘, ???????????‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘, ???????????‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘); ?????for(var i=0;i<codeLength;i++){ ?????????var charIndex = Math.floor(Math.random()*60); ?????????code +=selectChar[charIndex]; ?????} ?????return code; ?} ?function validate (){ ?????var inputCode = document.getElementById("vcode").value.toLowerCase(); ?????if(inputCode.length <=0){ ?????????alert("请输入验证码!"); ?????????return false; ?????} ?????else if(inputCode != code.toLowerCase()){ ?????????alert("验证码输入错误!"); ?????????show();//刷新验证码 ?????????return false; ?????}else{ ?????????alert("^-^ OK"); ?????????return true; ?????} ?} ?function show(){ ?????????//显示验证码 ?????????document.getElementById("code").src="CodeServlet?code="+createCode(); ?} ?window.onload = function() { ???????//document.onload=show(); ?????????show();//页面加载时加载验证码 ?????????//这时无论在ie还是在firefox中,js没有加载完,页面的东西是不会被执行的; ?????} ?</script></head><body> ???<form onsubmit="return validate();" action="" method="post"> ???????<h3>jsp+js+servlet实现验证码</h3> ???????<br /> 用户名:<input type="text" name="" /><br /> 请输入验证码: <input ???????????type="text" style="width: 60;" maxLength="5" /> <img ???????????src="" /> <a href="#" mce_href="#" ???????????>看不清,换一张!</a><br /> <input ???????????type="submit" /> ???</form></body></html>



      ???????????????
    ???????????????????

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

原文地址:https://www.cnblogs.com/jpfss/p/8444654.html

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