读书人

j2ee中兑现cookie的自动登录

发布时间: 2012-08-25 10:06:20 作者: rapoo

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 {// 获取数据层示例@Overridepublic 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);        @Overridepublic 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;// 用户登出@Overridepublic 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 id="smallLay">              <span><a href="javascript:closedialog()" onFocus="this.blur()" > <img src="<%=base%>images/cose.gif" /></a></span>              <p src="<%=base%><%=logo.getSmallPath()%>" /></p>              <div 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=""  style="color:red;text-decoration: underline;"">忘密</a></samp>                  <p><input type="button" 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> 


读书人网 >J2EE开发

热点推荐