亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? userloginmanager.java

?? 個人Blog java編寫的Blog可以直接使用!
?? JAVA
字號:
/*
 *  UserLoginManager.java
 *  
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *  
 *  Author: Winter Lau
 *  http://dlog4j.sourceforge.net
 *  
 */
package com.liusoft.dlog4j;

import java.sql.Timestamp;
import java.text.MessageFormat;
import java.text.ParseException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.liusoft.dlog4j.beans.UserBean;
import com.liusoft.dlog4j.dao.UserDAO;
import com.liusoft.dlog4j.util.RequestUtils;
import com.liusoft.dlog4j.util.StringUtils;

/**
 * 用戶登錄控制 采用Cookie與Session結合進行用戶登錄會話的判斷 
 * TODO: 阻止一個__ClientId使用多次
 * 
 * <pre>當你不能再擁有時,你唯一能做的,就是讓自己不要忘記</pre>
 * 
 * @author Winter Lau
 */
public class UserLoginManager {

	private final static Log log = LogFactory.getLog(UserLoginManager.class);
	
	/**
	 * 表單的提交時間必須是生成表單后的0.5秒鐘以上
	 */
	private final static int MIN_MS_BETWEEN_ACTION = 500;

	/**
	 * 表單的有效期是一個小時
	 */
	private final static int MAX_MS_BETWEEN_ACTION = 3600000;
	private final static String SESSION_USER_KEY = "UserBean";
	private final static String COOKIE_LASTLOGIN_KEY = "LL";//last login key
	private final static String COOKIE_UUID_KEY = "uuid";

	/**
	 * 自動登錄 用于Velocity頁面
	 * 
	 * @param request
	 * @param response
	 * @param uuid
	 * @param verify_host
	 * @return
	 * @see com.liusoft.dlog4j.velocity.DLOG_VelocityTool#verify_login_cookie(String,
	 *      boolean)
	 */
	public static SessionUserObject getLoginUser(HttpServletRequest request,
			HttpServletResponse response, boolean verify_host) {
		// 如果session有記錄則直接從session中讀取并返回
		Cookie uuidCookie = null;
		HttpSession ssn = request.getSession(false);
		if (ssn != null) {
			SessionUserObject user = (SessionUserObject) ssn
					.getAttribute(SESSION_USER_KEY);
			if (user != null){				
				uuidCookie = getUuidCookie(request);
				//必須是session值存在,且cookie值也存在才有效
				//(主要針對集群環境下,用戶在s1注銷了,但是鏈接跳到s2時候還是顯示登錄狀態)
				if(uuidCookie!=null)
					return user;
				ssn.invalidate();
				return null;
			}
		}
		String uuid = null;
		if(uuidCookie == null)
			uuidCookie = getUuidCookie(request);
		if (uuidCookie != null)
			uuid = uuidCookie.getValue();
		if(StringUtils.isEmpty(uuid))
			return null;
		// session不存在用戶資料則執行自動登錄過程
		try {
			UUID oUUID = new UUID(uuid);
			String new_host = request.getRemoteAddr();
			if (verify_host && !StringUtils.equals(new_host, oUUID.host))
				return null;
			UserBean user = UserDAO.getUserByID(oUUID.uid);
			// 用戶不存在
			if (user == null || user.getStatus() != UserBean.STATUS_NORMAL
					|| user.getPassword().hashCode() != oUUID.pwdCode) {
				RequestUtils.setCookie(request, response, COOKIE_UUID_KEY, "", 0);
				RequestUtils.setCookie(request, response, COOKIE_LASTLOGIN_KEY, "", 0);
				return null;
			}
			int keep_days = user.getKeepDays();
			if(keep_days < 1) keep_days = 365;
			return loginUser(request, response, user, keep_days);
		} catch (Exception e) {
			log.error("Exception occur when get current user.", e);
		}

		return null;
	}

	/**
	 * 更新已登錄的會話中的用戶資料
	 * 
	 * @param req
	 * @param ubean
	 */
	public static void updateLoginUser(HttpServletRequest req, UserBean ubean) {
		HttpSession ssn = req.getSession(true);
		if (ssn != null && ubean != null) {
			ssn.setAttribute(SESSION_USER_KEY, SessionUserObject
					.copyFrom(ubean));
		}
	}

	/**
	 * 返回保存用戶登錄信息的Cookie
	 * 
	 * @param request
	 * @return
	 */
	protected static Cookie getUuidCookie(HttpServletRequest request) {
		return RequestUtils.getCookie(request, COOKIE_UUID_KEY);
	}

	/**
	 * 執行用戶登錄過程
	 * 
	 * @param req
	 * @param res
	 * @param ubean
	 * @param keepDays
	 * @see com.liusoft.dlog4j.action.UserAction#doLogin(ActionMapping,
	 *      ActionForm, HttpServletRequest, HttpServletResponse)
	 */
	public static SessionUserObject loginUser(HttpServletRequest req,
			HttpServletResponse res, UserBean ubean, int keepDays) {
		HttpSession ssn = req.getSession(false);
		if (ssn != null) {
			SessionUserObject rub = (SessionUserObject) ssn
					.getAttribute(SESSION_USER_KEY);
			if (rub != null && rub.getId()==ubean.getId()) {
				return rub;
			}
		}
		
		// 更新用戶資料中最近一次訪問時間以及訪問地址,同時設置在線狀態
		ubean.setLastAddr(req.getRemoteAddr());
		ubean.setLastTime(new Timestamp(System.currentTimeMillis()));
		ubean.setKeepDays(keepDays);
		ubean.setOnlineStatus(1);
		DLOGUserManager.update(ubean);

		// 寫登錄信息到cookie,不使用session保存用戶資料
		UUID uuid = new UUID();
		uuid.uid = ubean.getId();
		uuid.pwdCode = ubean.getPassword().hashCode();
		uuid.host = req.getRemoteAddr();

		String value = uuid.toString();
		RequestUtils.setCookie(req, res, COOKIE_UUID_KEY, value,
				(keepDays > 0) ? keepDays * 86400 : -1);
		RequestUtils.setCookie(req, res, COOKIE_LASTLOGIN_KEY, ubean.getLastTime()
				.toString(), -1);
		
		// 用戶資料保存在Session中
		if (ssn == null)
			ssn = req.getSession(true);
		if (ssn != null && ubean != null) {
			ssn.setAttribute(SESSION_USER_KEY, SessionUserObject
					.copyFrom(ubean));
		}
		return ubean;
	}

	/**
	 * 注銷用戶
	 * 
	 * @param req
	 * @param res
	 * @see com.liusoft.dlog4j.action.UserAction#doLogout(ActionMapping,
	 *      ActionForm, HttpServletRequest, HttpServletResponse, String)
	 */
	public static void logoutUser(HttpServletRequest req,
			HttpServletResponse res) {
		// 清除用戶表中的keep_days字段的值,用戶下次不能再自動登錄
		SessionUserObject ubean = getLoginUser(req, res, false);
		if (ubean != null && ubean.getKeepDays() != 0) {
			DLOGUserManager.userLogout(ubean, true);
		}

		// 清除Cookie
		RequestUtils.setCookie(req, res, COOKIE_UUID_KEY, "", 0);
		RequestUtils.setCookie(req, res, COOKIE_LASTLOGIN_KEY, "", 0);

		// 清除session
		HttpSession ssn = req.getSession(false);
		if (ssn != null) {
			ssn.invalidate();
		}
	}

	/**
	 * 注銷用戶
	 * 
	 * @param userid
	 * @param lastLogin
	 * @see SessionUserObject#valueUnbound(HttpSessionBindingEvent)
	 */
	public static void logoutUser(SessionUserObject user) {
		DLOGUserManager.userLogout(user, false);
	}

	/**
	 * 驗證客戶端安全識別碼
	 * 
	 * @param req
	 * @param clientId
	 * @return
	 */
	public static boolean validateClientId(HttpServletRequest req,
			String clientId) {
		return ClientID.validate(req, clientId);
	}

	/**
	 * 生成客戶端安全識別碼
	 * 
	 * @param req
	 * @return
	 */
	public static String generateClientId(HttpServletRequest req,
			HttpServletResponse res) {
		return ClientID.generate(req, res);
	}

	/**
	 * 自動登錄標識
	 * 
	 * @author liudong
	 */
	private static class UUID {

		/**
		 * 自動登錄標識的加密密碼 IMPORTANT: 建議修改該值后重新編譯系統以保證系統的安全性 該密鑰的長度必須是8的整數倍
		 */
		private final static String UUID_ENCRYPT_KEY = "1D2L3O4G546J7V83";

		private final static String PATTERN = "{0}_{1}@{2}";

		private final static MessageFormat parser = new MessageFormat(PATTERN);

		public int uid;

		public String host;

		public int pwdCode;

		public UUID() {
		}

		/**
		 * 序列化到字符串
		 */
		public String toString() {
			String uuid = MessageFormat.format(PATTERN, new String[] {
					String.valueOf(uid), String.valueOf(pwdCode), host });
			return StringUtils.encrypt(uuid, UUID_ENCRYPT_KEY);
		}

		/**
		 * 還原
		 * 
		 * @param cookie
		 * @return
		 * @throws ParseException
		 */
		public UUID(String cookie) throws ParseException {
			String uuid = StringUtils.decrypt(cookie, UUID_ENCRYPT_KEY);
			Object[] args = parser.parse(uuid);
			uid = Integer.parseInt((String) args[0]);
			pwdCode = Integer.parseInt((String) args[1]);
			host = (String) args[2];
		}

	}

	/**
	 * 客戶端驗證碼
	 * 
	 * @author liudong
	 */
	private static class ClientID {

		private final static String CLIENTID_ENCRYPT_KEY = "DLOG4JV3";

		private final static String PATTERN = "{0}|{1}|{2}";

		private final static MessageFormat parser = new MessageFormat(PATTERN);

		/**
		 * 生成客戶端安全識別碼
		 * 
		 * @param req
		 * @return
		 */
		public static String generate(HttpServletRequest req,
				HttpServletResponse res) {
			long ct = System.currentTimeMillis();
			String user_agent = RequestUtils.getHeader(req, Globals.USER_AGENT);
			String remote_host = req.getRemoteAddr();
			StringBuffer code = new StringBuffer();
			code.append(ct);
			code.append('|');
			code.append(remote_host);
			code.append('|');
			if (user_agent != null)
				code.append(Math.abs(user_agent.hashCode()));
			else
				code.append(ct);
			return StringUtils.encrypt(code.toString(), CLIENTID_ENCRYPT_KEY);
		}

		/**
		 * 驗證客戶端安全識別碼
		 * 
		 * @param req
		 * @param clientId
		 * @return
		 */
		public static boolean validate(HttpServletRequest req, String clientId) {
			String clientCode = StringUtils.decrypt(clientId,
					CLIENTID_ENCRYPT_KEY);
			try {
				Object[] objs = parser.parse(clientCode);
				String host = req.getRemoteAddr();
				if (host.equals(objs[1])) {
					String user_agent = RequestUtils.getHeader(req,
							Globals.USER_AGENT);
					String ua = (user_agent!=null)?String.valueOf(Math.abs(user_agent.hashCode())):null;
					if (objs[2].equals(ua) || objs[2].equals(objs[0])) {
						long lt = Long.parseLong((String) objs[0]);
						long ct = System.currentTimeMillis();
						// 客戶端識別碼的有效期是一個鐘頭
						long it = ct - lt;
						if (MIN_MS_BETWEEN_ACTION < it
								&& it < MAX_MS_BETWEEN_ACTION) {
							return true;
						}
					}
				}
			} catch (ParseException e) {
			}
			return false;
		}

	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷综合五月| 久久久美女艺术照精彩视频福利播放| 日韩欧美中文字幕一区| 亚洲欧洲一区二区在线播放| 奇米影视7777精品一区二区| 色综合色狠狠综合色| 久久精品亚洲精品国产欧美| 丝袜亚洲另类欧美| 91社区在线播放| 久久久久久久久久久久久夜| 日日欢夜夜爽一区| 欧美丝袜自拍制服另类| 亚洲丝袜精品丝袜在线| 成人免费毛片高清视频| 欧美精品一区二区不卡| 青青草91视频| 91精品国产综合久久婷婷香蕉| 国产精品国产三级国产aⅴ入口 | 亚洲第一综合色| 99久久久国产精品| 国产精品国产三级国产三级人妇 | 国产综合色在线视频区| 日韩情涩欧美日韩视频| 日韩中文字幕麻豆| 欧美裸体一区二区三区| 午夜伊人狠狠久久| 91.xcao| 亚洲第一二三四区| 欧美高清dvd| 亚洲va中文字幕| 7777精品久久久大香线蕉| 青青青伊人色综合久久| 日韩欧美二区三区| 国产在线播放一区二区三区| 欧美精品一区二区在线播放| 国产麻豆精品一区二区| 国产精品丝袜久久久久久app| 国产凹凸在线观看一区二区| 国产精品久久毛片a| av资源站一区| 亚洲一区二区三区四区的| 欧美日韩国产精选| 久久国产精品区| 久久久久久日产精品| www.成人网.com| 一区二区三区日韩精品| 91 com成人网| 国产精品91一区二区| 中文一区在线播放| 91福利资源站| 日本欧美加勒比视频| 久久久国产一区二区三区四区小说| 国产精品2024| 亚洲午夜激情网站| 欧美电影精品一区二区| 成人激情av网| 亚洲va中文字幕| 国产日韩欧美在线一区| 色综合久久久久久久久久久| 日韩精品久久久久久| 久久久另类综合| 欧美在线999| 紧缚奴在线一区二区三区| 一区在线观看视频| 制服丝袜亚洲色图| www.综合网.com| 免费在线观看一区二区三区| 中文在线资源观看网站视频免费不卡 | 九九精品一区二区| 亚洲人妖av一区二区| 日韩欧美国产小视频| 91丝袜高跟美女视频| 蜜桃一区二区三区在线| 亚洲欧美日韩一区二区三区在线观看 | 久久综合色8888| 色哟哟一区二区在线观看 | 91丨九色丨蝌蚪丨老版| 日韩黄色免费网站| 亚洲日本在线视频观看| 久久久91精品国产一区二区三区| 欧美性受xxxx黑人xyx性爽| 国产精品一二三四| 日本人妖一区二区| 亚洲综合激情小说| 中文字幕在线观看一区二区| www日韩大片| 在线不卡免费av| 欧美伊人久久久久久久久影院| 国产99久久久久久免费看农村| 秋霞影院一区二区| 亚洲一区二区高清| 亚洲欧美日本在线| 日本一二三四高清不卡| 2023国产精品| 日韩欧美黄色影院| 7878成人国产在线观看| 欧美唯美清纯偷拍| 色狠狠色噜噜噜综合网| 99久久免费国产| 成人av在线网站| 懂色av中文字幕一区二区三区 | 亚洲国产高清不卡| 26uuuu精品一区二区| 精品欧美乱码久久久久久1区2区| 欧美精品欧美精品系列| 欧美在线观看一二区| 欧美性生交片4| 在线观看日韩电影| 色综合久久综合| 欧美亚一区二区| 在线观看日韩电影| 欧美亚洲国产bt| 欧美日韩国产不卡| 9191成人精品久久| 日韩欧美一级片| 日韩精品最新网址| 久久夜色精品一区| 国产日本一区二区| 亚洲三级视频在线观看| 日韩美女视频一区二区| 亚洲综合免费观看高清完整版| 亚洲一级电影视频| 日本最新不卡在线| 激情综合网天天干| 国产传媒日韩欧美成人| av亚洲精华国产精华精华| 91丨九色丨黑人外教| 欧美性一二三区| 日韩精品在线一区| 国产蜜臀av在线一区二区三区| 中文字幕一区在线| 亚洲一区二区视频在线| 日韩电影在线观看网站| 国产精品一区二区男女羞羞无遮挡| 风间由美一区二区av101| 91福利在线观看| 欧美一区二区三区在线视频| 久久亚洲精精品中文字幕早川悠里 | 国产精品三级久久久久三级| 亚洲精品水蜜桃| 欧美aa在线视频| 成人午夜电影久久影院| 欧美专区在线观看一区| 精品日韩一区二区| 亚洲视频精选在线| 日韩精品视频网| 成人黄色av电影| 91精品国产综合久久久久久| 国产午夜三级一区二区三| 一区二区三区在线视频观看| 久草这里只有精品视频| 色综合一区二区| 欧美成人一级视频| 亚洲综合在线五月| 国产在线视频精品一区| 欧美综合久久久| 中文字幕国产精品一区二区| 视频一区视频二区中文字幕| www.日韩大片| 日韩你懂的在线播放| 一区二区三区免费| 国产成人av一区二区三区在线| 欧美怡红院视频| 国产精品高潮呻吟| 国产一区免费电影| 91麻豆精品国产综合久久久久久 | 在线亚洲人成电影网站色www| 精品三级在线观看| 亚洲第一成年网| 99久久综合狠狠综合久久| 欧美大胆一级视频| 亚洲国产一区在线观看| 91在线精品一区二区| 久久久亚洲国产美女国产盗摄| 五月天中文字幕一区二区| aaa亚洲精品| 欧美国产一区视频在线观看| 美女国产一区二区| 在线不卡中文字幕播放| 亚洲激情图片qvod| 91麻豆高清视频| 中文字幕一区不卡| 成人激情文学综合网| 欧美国产精品久久| 国产精品18久久久久| 精品国产一区二区精华| 日韩成人精品在线| 欧美男男青年gay1069videost| 最新成人av在线| 99久久精品一区二区| **欧美大码日韩| 91在线国产观看| 亚洲青青青在线视频| 91黄色免费看| 亚洲123区在线观看| 欧美最新大片在线看| 亚洲国产三级在线| 欧美久久一区二区| 日本不卡在线视频| 精品国产青草久久久久福利|