日期:2014-05-19  浏览次数:20687 次

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 {