成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

java單點(diǎn)登錄的實(shí)現(xiàn)

最近公司要做一個(gè)單點(diǎn)登陸的應(yīng)用,整合論壇和網(wǎng)站。到網(wǎng)上找了好些資料,終于圓滿解決,博客中記錄一下一面忘掉。單點(diǎn)登錄首先首先要保持?jǐn)?shù)據(jù)庫數(shù)據(jù)的一致性,這個(gè)實(shí)現(xiàn)方式很多我就不多廢話了。剛開始我的想法是在一

最近公司要做一個(gè)單點(diǎn)登陸的應(yīng)用,整合論壇和網(wǎng)站。到網(wǎng)上找了好些資料,終于圓滿解決,博客中記錄一下一面忘掉。

單點(diǎn)登錄首先首先要保持?jǐn)?shù)據(jù)庫數(shù)據(jù)的一致性,這個(gè)實(shí)現(xiàn)方式很多我就不多廢話了。

剛開始我的想法是在一個(gè)應(yīng)用中登陸的時(shí)候發(fā)送一個(gè)http請求到另一個(gè)應(yīng)用保證兩個(gè)應(yīng)用同時(shí)擁有session,后來考慮到session過期不同步的問題只能放棄。為了保持session的完全同步我只能求助于cookie,首先說一下思路:
1.為了兩個(gè)應(yīng)用個(gè)應(yīng)用能同時(shí)訪問到cookie,cookie設(shè)置的時(shí)候要設(shè)置path在根目錄(同一個(gè)服務(wù)器下的不
同應(yīng)用,不在同一個(gè)應(yīng)用下可以用共用域名比如說 .baidu.com),必須保證cookie在統(tǒng)一一個(gè)域下
2.在訪問一個(gè)應(yīng)用的時(shí)候首先檢測session如果存在就是已經(jīng)登錄保存cookie(保證cookie是最新的)
3.如果session不存在檢測cookie如果cooki不存在說明在另一應(yīng)用中也沒有登錄
4.cookie存在檢測創(chuàng)建時(shí)間(當(dāng)然保存的時(shí)候要設(shè)置一個(gè)時(shí)間)如果沒有過期就用cookie中保存的用戶名密碼調(diào)用一下登錄方法
5.登陸成功保存cookie

為了保證每次請求都能檢測我使用了filter下面貼一下filter代碼
import java.io.IOException;

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

public class LoginFilter implements Filter {

private String loginInfoPath;
public void destroy() {
loginInfoPath = null;
}

public void doFilter(ServletRequest sreq, ServletResponse sresp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) sreq;
HttpServletResponse resp = (HttpServletResponse) sresp;
Class loginInfoClass = null;
LoginInfoBase loginInfo = null;
try {
loginInfoClass = Class.forName(loginInfoPath);
loginInfo = (LoginInfoBase) loginInfoClass.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
loginInfo.setReq(req);
loginInfo.setResp(resp);
//session值為空
if(loginInfo.isSessionEmpty()){
if(loginInfo.init()){
boolean loginResult = loginInfo.doLogin();
if(loginResult){
loginInfo.saveCookie();
}
}
}else{
if(loginInfo.init()){
//另外一套系統(tǒng)已經(jīng)退出
if("out".equals(loginInfo.getLoginState())){
loginInfo.doLogout();
CookieUtil.delCookie(resp, LoginInfoBase.COOKIE_NAME);
}
}
}
chain.doFilter(sreq, sresp);
}

public void init(FilterCon

標(biāo)簽: