`

j2ee中实现cookie的自动登录

阅读更多
.


1.用到的常量
package com.hydom.util;

public final class CommonConstants {

	// 系统 session 用户
	public final static String SESSION_USER = "session_user";
	
	/** 保存在浏览器中cookie的邮箱名称名 */
	public final static String BROWSER_COOKIE_EMAIL = "HKPhotoUserEmail";
	
	/** 保存在浏览器中cookie的邮箱密码名 */
	public final static String BROWSER_COOKIE_PASSWORD = "HKPhotoUserPassword";
	
	/** 保存在浏览器中cookie的最大时间15天 */
	public final static int BROWSER_COOKIE_MAX_AGE = 15*24*60*60;
	
	/** 保存在浏览器中cookie的自动登录状态名 */
	public final static String BROWSER_COOKIE_AUTO_STATUS_NAME = "HKPhotoAutoLoginStatus";
	
	/** 保存在浏览器中cookie的退出登录名 */
	public final static String BROWSER_COOKIE_LOGIN_OUT_NAME = "HKPhotoLoginOut";
}


2.过滤器
package com.hydom.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hydom.entity.User;
import com.hydom.service.IUserService;
import com.hydom.util.CommonConstants;
import com.hydom.util.pico.PicoContainer;

/**
 *功能:首先检测session中是否有user,如果没有再检测cookie中是否有对应的邮箱和密码<BR>
 * 如果有那么就查出该user放进session中<BR>
 * 如果都没有那么就doFilter()<BR>
 * 
 * @author ocaicai@yeah.net<BR>
 * @date 2011-9-22<BR>
 * @version 1.0 <BR>
 * 
 */
public class CookieLoginFilter extends BaseFilter {
	// 获取数据层示例

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {

		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;

		Object object = request.getSession().getAttribute(
				CommonConstants.SESSION_USER);

		User cookieUser = null;
		String email = null;
		String password = null;
		String autoStatus = null;

		if (object == null) {
			Cookie[] cookies = request.getCookies();
			if (cookies != null && cookies.length > 0) {
//				System.out.println("cookies.length=" + cookies.length);
				for (int i = 0; i < cookies.length; i++) {
					Cookie cookie = cookies[i];

					// 判断Cookie的邮箱名是否等于"HKPhotoUserEmail"
					if (CommonConstants.BROWSER_COOKIE_EMAIL.equals(cookie
							.getName())) {
						email = cookie.getValue().trim();
					}

					// 判断Cookie的密码名是否等于"HKPhotoUserPassword"
					if (CommonConstants.BROWSER_COOKIE_PASSWORD.equals(cookie
							.getName())) {
						password = cookie.getValue().trim();
					}

					// 判断Cookie的自动登录状态名是否等于"HKPhotoAutoLoginStatus"
					if (CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME
							.equals(cookie.getName())) {
						autoStatus = cookie.getValue().trim();
					}
				}
				if (autoStatus!=null&&autoStatus.equals("1")) {
					if (email != null && password != null && email.length() > 0
							&& password.length() > 0) {
						cookieUser = new User();
						cookieUser.setEmail(email);
						cookieUser.setPassword(password);

//						System.out.println("email=" + cookieUser.getEmail());
//						System.out.println("password="
//								+ cookieUser.getPassword());

						IUserService userService = PicoContainer.PICO
								.getComponent(IUserService.class);
						cookieUser = userService.validLogin(cookieUser);

						if (cookieUser != null) {
							// 将该user放入到session中
							request.getSession().setAttribute(
									CommonConstants.SESSION_USER, cookieUser);
						} else {
							chain.doFilter(request, response);
						}
					} else {
						chain.doFilter(request, response);
					}
				} else {
					chain.doFilter(request, response);
				}

			} else {
				chain.doFilter(request, response);
			}
		} else {
			chain.doFilter(request, response);
		}
	}

}



3.web.xml配置cookie登录过滤器

	<!-- cookie邮箱和密码登陆过滤 -->
	<filter>
		<filter-name>cookie-login-filter</filter-name>
		<filter-class>com.hydom.filter.CookieLoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>cookie-login-filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


4.用户登录时

public class LoginAction extends BaseAction {
	private static final long serialVersionUID = 1L;
	private String email = null;// 用户邮箱
	private String password = null;// 用户密码
	private boolean autoLoginStatus = false;

	public boolean getAutoLoginStatus() {
		return autoLoginStatus;
	}

	public void setAutoLoginStatus(boolean autoLoginStatus) {
		this.autoLoginStatus = autoLoginStatus;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	// 获取数据层示例
	private IUserService userService = PicoContainer.PICO
			.getComponent(IUserService.class);
        @Override
	public String execute() throws Exception {
		try {
			// 验证用户信息
			String message = checkAndFilterUsersInfo();
			;
			User user = null;
			if (message == null) {
				user = new User();
				user.setEmail(this.email);
				user.setPassword(this.password);
				user = userService.validLogin(user);
			}

			// 输出结果
			StringBuilder msg = new StringBuilder();
			msg.append("{");
			if (user != null) {
				super.getSession().setAttribute(CommonConstants.SESSION_USER,
						user);
				msg.append("msg:'success'").append(",");
				msg.append("userName:'").append(user.getUserName()).append("'");

				if (autoLoginStatus) {		
					// 根据选择状态判断是否将用户邮箱和密码信息保存在客户端浏览器
					addCookieingUserToResponse(user);
				}else{
					removeCookieingUserInResponse();
				}

			} else {
				if (message == null) {
					msg.append("msg:'帳號或者密碼錯誤'");
				} else {
					msg.append("msg:'").append(message).append("'");
				}
			}

			msg.append("}");
			ajaxJson(msg.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将用户邮箱和密码信息添加到响应中
	 * 
	 * @param cookieingUser
	 */
	private void addCookieingUserToResponse(User cookieingUser) {

		// 设置cookie邮箱名值对
		Cookie cookieEmail = new Cookie(CommonConstants.BROWSER_COOKIE_EMAIL,
				cookieingUser.getEmail());
		cookieEmail.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		cookieEmail.setPath(super.getRequest().getContextPath());
		super.getResponse().addCookie(cookieEmail);

		// 设置cookie密码名值对
		Cookie cookiePassword = new Cookie(
				CommonConstants.BROWSER_COOKIE_PASSWORD, cookieingUser
						.getPassword());	
		cookiePassword.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		cookiePassword.setPath(super.getRequest().getContextPath());
		super.getResponse().addCookie(cookiePassword);
		
		
		// 设置cookie自动登录状态名值对
		Cookie autoLoginStatusCookie = new Cookie(
				CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,
				"1");
		autoLoginStatusCookie
				.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		autoLoginStatusCookie.setPath(super.getRequest()
				.getContextPath());
		super.getResponse().addCookie(autoLoginStatusCookie);
		
		// 设置cookie登出名值对
		Cookie loginOutCookie = new Cookie(
				CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,
				"0");
		loginOutCookie
				.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		loginOutCookie.setPath(super.getRequest()
				.getContextPath());
		super.getResponse().addCookie(loginOutCookie);
	}
	
	public void removeCookieingUserInResponse(){
		// 设置cookie邮箱名值对
		Cookie cookieEmail = new Cookie(CommonConstants.BROWSER_COOKIE_EMAIL,
				null);
		cookieEmail.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		cookieEmail.setPath(super.getRequest().getContextPath());
		super.getResponse().addCookie(cookieEmail);

		// 设置cookie密码名值对
		Cookie cookiePassword = new Cookie(
				CommonConstants.BROWSER_COOKIE_PASSWORD, null);	
		cookiePassword.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		cookiePassword.setPath(super.getRequest().getContextPath());
		super.getResponse().addCookie(cookiePassword);
		
		
		// 设置cookie自动登录状态名值对
		Cookie autoLoginStatusCookie = new Cookie(
				CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,
				"0");
		autoLoginStatusCookie
				.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		autoLoginStatusCookie.setPath(super.getRequest()
				.getContextPath());
		super.getResponse().addCookie(autoLoginStatusCookie);
		
		// 设置cookie登出名值对
		Cookie loginOutCookie = new Cookie(
				CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,
				"0");
		loginOutCookie
				.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		loginOutCookie.setPath(super.getRequest()
				.getContextPath());
		super.getResponse().addCookie(loginOutCookie);
	}
}


5.退出

public class LogOutAction extends BaseAction {
	private static final long serialVersionUID = 1L;

	// 用户登出
	@Override
	public String execute() throws Exception {
		super.getSession().removeAttribute(CommonConstants.SESSION_USER);
		
		// 设置cookie登出名值对
		Cookie loginOutCookie = new Cookie(
				CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,
				"1");
		loginOutCookie
				.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		loginOutCookie.setPath(super.getRequest()
				.getContextPath());
		super.getResponse().addCookie(loginOutCookie);
		
		// 设置cookie自动登录状态名值对
		Cookie autoLoginStatusCookie = new Cookie(
				CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,
				"0");
		autoLoginStatusCookie
				.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
		autoLoginStatusCookie.setPath(super.getRequest()
				.getContextPath());
		super.getResponse().addCookie(autoLoginStatusCookie);
		
		PrintWriter out = super.getResponse().getWriter();
		out.close();
		return null;
	}

}


6.jsp登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script src="<%=base%>js/common/jquery.js"></script>
<script src="<%=base%>js/common/jquery.cookie.js"></script>
<script type="text/javascript">
$(document).ready(function() {
	var email=$.cookie('<%=CommonConstants.BROWSER_COOKIE_EMAIL%>');
	var password=$.cookie('<%=CommonConstants.BROWSER_COOKIE_PASSWORD%>');
	var autoStatus=$.cookie('<%=CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME%>');
	var loginOut=$.cookie('<%=CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME%>');
	
	if(autoStatus=="0"&&loginOut=="1"){
		$("#newemail").attr("value",email.replace(new RegExp('"',"gm"),""));
		$("#newpassword").attr("value",password.replace(new RegExp('"',"gm"),""));
	}

});
</script>

<div class="hidden" id="smallLay">
              <span><a href="javascript:closedialog()" onFocus="this.blur()" > <img src="<%=base%>images/cose.gif" /></a></span>
              <p class="logo"><img onerror="this.src='<%=base%>images/logo.jpg'" src="<%=base%><%=logo.getSmallPath()%>" /></p>
              <div class="user">
                  <ul>
                      <li><b>郵箱:</b><input type="text" id="newemail" onblur="checkAdminEmail(this.value)" value=""/></li>
                      <li><b>密碼:</b><input type="password" id="newpassword" value=""/></li>
                  </ul>
                  <samp><input name="autoLoginStatus" id="autoLoginStatus" checked="checked" type="checkbox" value=""  class="check"/><d>下次自動登陸</d> <a href="javascript:startRegister()" style="color:red;text-decoration: underline;"">忘記密碼</a></samp>
                  <p><input type="button" class="land" onclick="gologin()"  value="登 录"/></p>
                  <samp><b>使用合作網站帳號登陸:</b><img src="<%=base%>images/f.gif" onclick="tofacelogin()"/><u></u><img src="<%=base%>images/sina.gif" /></samp>
              </div>
</div> 


分享到:
评论
1 楼 GRACEACT 2012-04-24  
[color=darkred][/color]代码很长,不过,对理解Cookie登录很帮助,非常感谢分享,

相关推荐

    j2ee自动登录

    下面我们将深入探讨这个主题,包括J2EE中的会话管理、Cookie的工作原理以及如何实现自动登录。 首先,J2EE提供了一套完整的会话管理机制,主要是通过Session对象来实现。Session是服务器为每个客户端维护的状态信息...

    j2ee练习8实现页面自动跳转

    通过上述分析,我们可以看到“j2ee练习8实现页面自动跳转”涵盖了Web开发中的多个核心概念和技术,包括页面跳转、Servlet、JSP、MVC模式以及Web应用的常规设计和调试。学习并掌握这些知识点,将有助于提升J2EE开发...

    j2ee实验二:学习使用Session和Cookie

    3. **设定Session生命周期**:设置Session的有效时间,以实现自动注销功能。 4. **开发一个下载文件的JavaEE Web应用**:创建一个能够提供文件下载服务的Web应用。 5. **开发一个Session监听器**:实现Session创建和...

    j2ee,ex2答案

    - 实现Cookie功能,比如设置和读取Cookie,了解其工作原理。 - 深入理解Session和Cookie在实际应用中的使用场景和优缺点。 通过这个练习,你可以深入理解J2EE中的Session和Cookie机制,提高Web开发能力。《ex2实验...

    j2ee 笔记 j2ee 笔记 j2ee 笔记

    - **Cookie**:客户端用来存储少量数据的一种方式,当浏览器向服务器发送请求时会自动带上对应的Cookie。 示例代码: ```java // 设置Session HttpSession session = request.getSession(); session.setAttribute(...

    J2EE练习2的题目,代码,报告

    Cookie是另一种常见的会话管理手段,它是由服务器发送到客户端的一小段文本信息,客户端在后续的请求中会自动附带回去。Cookie通常用于存储非敏感的用户信息,如首选项或购物车内容。需要注意的是,Cookie的大小有...

    J2EE网上书店

    本项目“经典毕业设计网上书店”正是基于J2EE技术实现的一个实例,旨在展示如何运用这些技术来创建一个完整的电子商务网站。 1. **项目架构** 该项目通常采用三层架构设计:表现层、业务逻辑层和数据访问层。表现...

    j2ee专用的验证码

    在J2EE应用程序开发中,验证码(CAPTCHA)是一种常用的安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、恶意登录等。验证码通常由字母和数字组成,设计目的是让人类用户能轻松识别,但对计算机程序...

    IBM J2EE Development 精品教程

    - **实现方法**:如何将Web服务集成到现有的J2EE应用中。 #### 五、应用部署 ##### 38. 应用服务器安装 (UNIT38) - **安装步骤**:详细介绍如何安装和配置应用服务器。 - **常用应用服务器**:IBM WebSphere、...

    常适合新手练手的J2EE实战项目,jsp数据库开发OA自动化办公系统 .rar

    【标题】和【描述】提及的是一个针对新手的J2EE实战项目,主要涉及使用...通过这个实战项目,新手不仅能够掌握J2EE开发的基本技能,还能了解到如何将这些技术应用于实际的办公自动化系统中,从而提升自己的开发能力。

    j2ee开发的网上书店源代码

    在本项目中,J2EE的组件模型包括了Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)等,它们共同协作以实现系统的业务逻辑和数据处理。 1. **Servlet**:Servlet是Java中处理HTTP请求的服务器端组件...

    登陆web java j2ee

    在Java J2EE中,我们可以使用Servlet、JSP(JavaServer Pages)、JSTL(JavaServer Pages Standard Tag Library)和EL(Expression Language)等技术来实现。 1. **Servlet**:Servlet是Java编写的服务器端程序,...

    简单实现web单点登录

    当用户在系统A中登录后,系统会生成一个安全的票据(如JWT或Session ID),并将这个票据存储在一个中央认证服务器上。当用户尝试访问系统B时,系统B会检查是否有有效的票据,如果有,则自动登录用户,无需再次输入...

    基于j2ee框架开发的博客管理系统

    4. **EJB(Enterprise JavaBeans)**:在J2EE环境中,EJB是可重用的服务器端组件,用于实现业务逻辑。在博客系统中,可能有UserBean来处理用户操作,ArticleBean来处理文章管理等。 5. **MVC(Model-View-...

    j2e实现登录、信息修改

    本篇文章将深入探讨如何使用J2EE实现用户登录、信息修改以及数据添加等功能。 首先,让我们关注登录功能的实现。在J2EE中,登录通常涉及到用户接口(UI)、控制器(Controller)和数据访问对象(DAO)。用户在UI上...

    J2EE武功秘籍

    - **观察者模式**:多对一的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 **4. 经典企业设计模式** - **MVC (Model-View-Controller)**:将业务逻辑、数据和界面展示分离。 -...

    J2EE课程总结

    ### J2EE课程总结 #### 数据库:Oracle **1. Oracle SQL基础知识** - **选择行**:通过`SELECT`语句结合`WHERE`子句来实现特定条件下的数据筛选。 - **限制选择行**:利用`LIMIT`或`ROWNUM`来限制返回结果的数量...

    基于J2EE网上招聘系统的设计与实现毕业论文.doc

    《基于J2EE网上招聘系统的设计与实现》这篇毕业论文主要探讨了如何利用J2EE技术构建一个高效、便捷的在线招聘系统。J2EE(Java 2 Platform, Enterprise Edition)是一个用于开发和部署企业级应用程序的开放平台,它...

    基于BS模式的J2EE技术的百飞特网上订餐系统的设计与实现-源码

    总结,《基于BS模式的J2EE技术的百飞特网上订餐系统》是一个全面的餐饮服务平台,它集成了前端交互、后端处理、数据库管理和安全防护等多个方面,展示了J2EE在Web应用中的强大能力。这个项目不仅可以作为学习J2EE...

    j2ee服务器端生成带有背景验证码

    在J2EE应用程序开发中,验证码(CAPTCHA)是一种常用的安全机制,用于防止自动化程序(如机器人或爬虫)对网站进行恶意操作,如注册、登录等。它要求用户输入图像上显示的一串随机字符,以此验证用户是人而不是机器...

Global site tag (gtag.js) - Google Analytics