zoukankan      html  css  js  c++  java
  • 关于在页面得到的servlet验证码总是上一次保存在session中的

    在网上找到一份servlet产生验证码的代码,经过测试,发现在页面通过session.getAttribute()方法得到的验证码总是上一次保存在session中的,这样,它总比页面实际的验证码晚一拍。网上一种说法是session早于页面加载。多数人解决方法是用一个中间页面,或者一个servlet来比较输入的验证码是否是session中保存的验证码来解决的,也有通过ajax异步加载来解决的,本人通过中间servlet比较来解决的,测试过程如下,以备后用:

    1. 页面
    Java代码  收藏代码
    1. <%@page import="java.util.Date"%>  
    2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
    3.     pageEncoding="UTF-8"%>  
    4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    5. <html>  
    6. <head>  
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    8. <title>Insert title here</title>  
    9. <%  
    10.     String context = request.getContextPath();  
    11. %>  
    12. <script type="text/javascript">  
    13.     function reloadIdentifyCode() {  
    14.         document.getElementById("btn").disable = true;  
    15.         document.getElementById("code").src = "<%=context %>/generateidentifycode?time=" + new Date().getTime();  
    16.     }  
    17.     function isIdentifyCodeRight() {  
    18.         //must quote the jsp sentence  
    19.         var input = document.getElementById("identify_code").value;  
    20.         <%  
    21.             String identifyCode = (String) session.getAttribute("identifyCode");  
    22.         %>  
    23.         alert("You input:" + input + ", the answer is:" + "<%=identifyCode %>");  
    24.         if(input == "<%=identifyCode %>") {  
    25.             return true;  
    26.         }  
    27.         else {  
    28.             return false;  
    29.         }  
    30.     }  
    31. </script>  
    32. </head>  
    33. <body>  
    34.     <div id="" align="center">  
    35.         <form action="<%=context %>/user/findpwd" method="post">  
    36.             <table>  
    37.                 <tr>  
    38.                     <td>用户名:</td>  
    39.                     <td><input id="userName" type="text" value="Email/手机号/用户名" name="userName"></td>  
    40.                 </tr>  
    41.                 <tr>  
    42.                     <td>验证码:</td>  
    43.                     <td><input id="identify_code" type="text" maxlength="6" value="" name="identifyCode">  
    44.                 <img id="code" alt="" src="<%=context %>/generateidentifycode?time=<%=new Date().getTime() %>">  
    45.                 <input id="btn" type="button" value="换张图片" onclick="reloadIdentifyCode()"></td>  
    46.                 </tr>  
    47.                 <tr>  
    48.                     <td colspan="2"><input type="submit" value="发送验证码到邮箱"></td>  
    49.                 </tr>  
    50.             </table>  
    51.         </form>  
    52.     </div>  
    53. </body>  
    54. </html>  


    2. 中间servlet
    Java代码  收藏代码
    1. package com.jesse.onlineshop.servlet;  
    2.   
    3. import java.io.IOException;  
    4. import java.util.Date;  
    5. import java.util.regex.Matcher;  
    6. import java.util.regex.Pattern;  
    7.   
    8. import javax.servlet.ServletException;  
    9. import javax.servlet.http.HttpServlet;  
    10. import javax.servlet.http.HttpServletRequest;  
    11. import javax.servlet.http.HttpServletResponse;  
    12.   
    13. import com.jesse.onlineshop.bean.User;  
    14. import com.jesse.onlineshop.exception.DaoException;  
    15. import com.jesse.onlineshop.service.UserService;  
    16. import com.jesse.onlineshop.service.impl.UserServiceImpl;  
    17.   
    18. /** 
    19.  * 因为session先于验证码图片加载,在jsp页面通过session得到的验证码总是上一次的, 
    20.  * 所以,这里借助Ajax通过异步机制来比较用户输入的验证码和session中保存的验证码是 否一致来达到验证的目的 
    21.  * @author Administrator 
    22.  * 
    23.  */  
    24. public class FindPassWordServlet extends HttpServlet {  
    25.   
    26.     private static final long serialVersionUID = 7331068570820532059L;  
    27.   
    28.     private User user;  
    29.     private UserService userService = new UserServiceImpl();  
    30.   
    31.     @Override  
    32.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
    33.             throws ServletException, IOException {  
    34.         String input = req.getParameter("identifyCode");    //获取用户输入的code  
    35.         String answer = (String) req.getSession(false).getAttribute(    //获取session中保存的code  
    36.                 "identifyCode");  
    37.         if (!input.equalsIgnoreCase(answer)) {  
    38.             req.getRequestDispatcher("/user/wrongcode.jsp").forward(req, resp);  
    39.         } else {  
    40.             String userName = req.getParameter("userName");  
    41.             String regex = "[0-9]{11}";  
    42.             Pattern pattern = Pattern.compile(regex);  
    43.             Matcher matcher = pattern.matcher(userName);  
    44.             if (matcher.matches()) {  
    45.             } else if (userName.contains("@")) {  
    46.                 try {  
    47.                     user = userService.getUserByEmail(userName);  
    48.                 } catch (DaoException e) {  
    49.                     e.printStackTrace();  
    50.                 }  
    51.             } else {  
    52.                 try {  
    53.                     user = userService.getUserByName(userName);  
    54.                 } catch (DaoException e) {  
    55.                     e.printStackTrace();  
    56.                 }  
    57.             }  
    58.             String email = user.getEmail();  
    59.             userName = user.getUserName();  
    60.             String url = req.getContextPath() + "/confidential/user/changepwd?user="+userName+"&&time=" + new Date().getTime();  
    61.               
    62.             try {  
    63.                 userService.addChangePwdReqRecord(userName);  
    64.             } catch (DaoException e) {  
    65.                 e.printStackTrace();  
    66.                 throw new ServletException(e.getMessage());  
    67.             }  
    68.               
    69.             userService.sendChangePassWordRequest(email, url);  
    70.             req.getRequestDispatcher("findpwdsuccess.jsp").forward(req, resp);  
    71.         }  
    72.     }  
    73.   
    74. }  

  • 相关阅读:
    对指定文件生成数字摘要的MD5工具类
    shell脚本学习积累笔记(第一篇)
    java项目打成jar包时引用了第三方jar,此时我们该如何解决呢
    分享关于学习new BufferedWriter()方法时常遇到的一个无厘头的问题
    WebService学习整理(一)——客户端三种调用方式整理
    TZOJ 挑战题库随机训练02
    TZOJ 挑战题库随机训练01
    TZOJ 2943 Running Median(动态中位数)
    TZOJ 3927 Circular Sequence(环形最大子段和)
    TZOJ 3698 GCD depth(数学)
  • 原文地址:https://www.cnblogs.com/jpfss/p/8444106.html
Copyright © 2011-2022 走看看