`

关于在页面得到的servlet验证码总是上一次保存在session中的

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

1. 页面
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
	String context = request.getContextPath();
%>
<script type="text/javascript">
	function reloadIdentifyCode() {
		document.getElementById("btn").disable = true;
		document.getElementById("code").src = "<%=context %>/generateidentifycode?time=" + new Date().getTime();
	}
	function isIdentifyCodeRight() {
		//must quote the jsp sentence
		var input = document.getElementById("identify_code").value;
		<%
			String identifyCode = (String) session.getAttribute("identifyCode");
		%>
		alert("You input:" + input + ", the answer is:" + "<%=identifyCode %>");
		if(input == "<%=identifyCode %>") {
			return true;
		}
		else {
			return false;
		}
	}
</script>
</head>
<body>
	<div id="" align="center">
		<form action="<%=context %>/user/findpwd" method="post">
			<table>
				<tr>
					<td>用户名:</td>
					<td><input id="userName" type="text" value="Email/手机号/用户名" name="userName"></td>
				</tr>
				<tr>
					<td>验证码:</td>
					<td><input id="identify_code" type="text" maxlength="6" value="" name="identifyCode">
				<img id="code" alt="" src="<%=context %>/generateidentifycode?time=<%=new Date().getTime() %>">
				<input id="btn" type="button" value="换张图片" onclick="reloadIdentifyCode()"></td>
				</tr>
				<tr>
					<td colspan="2"><input type="submit" value="发送验证码到邮箱"></td>
				</tr>
			</table>
		</form>
	</div>
</body>
</html>


2. 中间servlet
package com.jesse.onlineshop.servlet;

import java.io.IOException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jesse.onlineshop.bean.User;
import com.jesse.onlineshop.exception.DaoException;
import com.jesse.onlineshop.service.UserService;
import com.jesse.onlineshop.service.impl.UserServiceImpl;

/**
 * 因为session先于验证码图片加载,在jsp页面通过session得到的验证码总是上一次的,
 * 所以,这里借助Ajax通过异步机制来比较用户输入的验证码和session中保存的验证码是 否一致来达到验证的目的
 * @author Administrator
 *
 */
public class FindPassWordServlet extends HttpServlet {

	private static final long serialVersionUID = 7331068570820532059L;

	private User user;
	private UserService userService = new UserServiceImpl();

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String input = req.getParameter("identifyCode");	//获取用户输入的code
		String answer = (String) req.getSession(false).getAttribute(	//获取session中保存的code
				"identifyCode");
		if (!input.equalsIgnoreCase(answer)) {
			req.getRequestDispatcher("/user/wrongcode.jsp").forward(req, resp);
		} else {
			String userName = req.getParameter("userName");
			String regex = "[0-9]{11}";
			Pattern pattern = Pattern.compile(regex);
			Matcher matcher = pattern.matcher(userName);
			if (matcher.matches()) {
			} else if (userName.contains("@")) {
				try {
					user = userService.getUserByEmail(userName);
				} catch (DaoException e) {
					e.printStackTrace();
				}
			} else {
				try {
					user = userService.getUserByName(userName);
				} catch (DaoException e) {
					e.printStackTrace();
				}
			}
			String email = user.getEmail();
			userName = user.getUserName();
			String url = req.getContextPath() + "/confidential/user/changepwd?user="+userName+"&&time=" + new Date().getTime();
			
			try {
				userService.addChangePwdReqRecord(userName);
			} catch (DaoException e) {
				e.printStackTrace();
				throw new ServletException(e.getMessage());
			}
			
			userService.sendChangePassWordRequest(email, url);
			req.getRequestDispatcher("findpwdsuccess.jsp").forward(req, resp);
		}
	}

}
分享到:
评论

相关推荐

    验证码校验servlet实现

    - 保存验证码:将生成的验证码保存到Session中,以便后续校验时使用。 - 生成图片:将随机字符串转化为图像,可以使用Java的`Graphics2D`类来绘制文本和干扰线,然后将其输出到HTTP响应。 2. **显示验证码**:当...

    jsp servlet 动态验证码

    3. Servlet接收到请求后,生成新的随机验证码,保存在session中,并绘制为图像。 4. Servlet将新验证码的图像数据回传给前端,JavaScript更新图像元素,显示新的验证码。 5. 用户输入验证码,前端再次通过AJAX发送...

    Servlet生成图片验证码

    7. **JSP页面展示**:在JSP页面中,通过一个`&lt;img&gt;`标签加载Servlet,Servlet会返回验证码的图像。通常,这个`&lt;img&gt;`标签的`src`属性指向`VerificationCodeServlet`的URL。 8. **验证用户输入**:当用户输入验证码...

    servlet验证码的代码

    常见的做法是将验证码保存在用户的会话(`HttpSession`)中,使用一个唯一的标识符(例如session ID)关联到用户。 4. **响应图像**: Servlet接收到请求后,生成验证码并将其保存到会话,然后将图像以JPEG或PNG...

    利用servlet动态生成验证码

    在Web开发中,Servlet是一种Java技术,用于生成动态网页内容。本教程主要讲解如何利用Servlet来实现动态生成验证码的功能,这对于防止机器人或恶意自动化程序在网站上进行非法操作至关重要。验证码通常由一串随机...

    js+Servlet实现验证码

    1. **存储验证码**:当页面加载时,Servlet生成一个验证码字符串,并将其存储在服务器的会话(session)中,以便后续验证。 2. **响应图像**:当JavaScript请求验证码图像时,Servlet根据存储的字符串生成图像并...

    javaweb用户验证码登录session例子

    在Java Web开发中,用户登录验证是不可或缺的一部分,而在这个"javaweb用户验证码登录session例子"中,我们将深入探讨如何结合验证码、用户密码以及Session技术来实现安全的登录过程。Session是Web应用中用于跟踪...

    java web笔记之servlet生成验证码

    4. 保存验证码:将生成的验证码保存在会话(Session)中,以便在验证时进行比较。使用`HttpServletRequest`对象的`getSession()`方法获取会话,然后用`setAttribute()`设置验证码。 5. 生成图像:使用Java的`java....

    用servlet实现动态的生成验证码,点击验证码改变,及验证码的校验

    在Web开发中,验证码是一种广泛使用的安全机制,用于防止自动化的机器人或恶意脚本进行非法操作,例如防止垃圾邮件、刷票等。本教程将详细解释如何使用Servlet技术来实现一个动态的验证码功能,包括点击验证码后更换...

    servlet生成随机验证码

    // 将验证码保存在session中 request.getSession().setAttribute("captcha", randomCode); } } ``` 为了在客户端显示这个验证码,你需要在HTML页面中创建一个img标签,其src属性指向CaptchaServlet的URL。同时,...

    servlet实现的图片验证码

    在Web开发中,验证码是一种常见的安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、垃圾信息提交等。本教程将详细介绍如何使用Servlet技术来实现一个基本的图片验证码功能。Servlet是Java服务器端...

    jsp,servlet,验证码,验证码点击更换

    在实际开发中,为了提高用户体验,还可以考虑使用Cookie或者Session来保存用户当前的验证码,以便在验证时比较。同时,为了防止恶意刷新,可以设置每个验证码的有效期,过期后自动失效。 总的来说,JSP和Servlet...

    登录验证码servlet

    4. **存储和验证**:生成的验证码字符串需要存储在一个安全的地方,如服务器的会话(session)中。当用户输入验证码后,Servlet会对比输入值和存储的验证码,如果匹配则验证通过,否则提示错误。 5. **HTTP请求与...

    用servlet实现验证码功能

    以下是一个简单的Servlet验证码实现的伪代码: ```java import javax.imageio.ImageIO; import javax.servlet.http.HttpSession; import javax.servlet.ServletException; import javax.servlet....

    jsp 验证码(servlet)

    1. **随机生成验证码**:在Servlet中,可以使用`java.util.Random`类生成一个随机数字或字符串,作为验证码的内容。通常,验证码由4-6位数字或字母组成,以增加破解的难度。 2. **图像化验证码**:生成的验证码需要...

    java 实现验证码(servlet+jsp)

    验证码生成后,将其保存在session中,以便后续页面提交时进行验证。同时,将图像URL传递给JSP页面: ```java request.getSession().setAttribute("verifyCode", code); request.getRequestDispatcher(...

    页面显示验证码

    3. 将验证码保存到session:为了后续验证,需要将生成的验证码值存储在用户的session中,可以通过`HttpSession`对象来实现。 4. 发送图像到浏览器:Servlet将生成的验证码图像以HTTP响应的方式发送给客户端,通常...

    通过Session案例分析一次性验证码登录

    在这个案例中,Servlet用于生成验证码,并将验证码保存在Session中。同时,Servlet也用于处理用户的提交请求,并从Session中取出验证码数据。 在实现这个案例时,我们需要注意两个重要的方面:一是验证码的生成和...

    jsp页面中产生验证码

    在网页登录过程中,验证码是一种常见的安全机制,用于防止恶意机器人或自动脚本进行非法操作。在JSP(JavaServer Pages)环境中,实现验证码功能可以增强用户验证的安全性,避免无授权的登录尝试。本文将详细讲解...

    jsp页面验证码

    3. **保存验证码**:将生成的验证码保存在服务器的会话(session)中,以便后续验证时使用。 ```java request.getSession().setAttribute("captcha", captchaCode); ``` 接下来,在JSP页面上,我们将显示这个...

Global site tag (gtag.js) - Google Analytics