單點登錄(SingleSignOn),簡稱爲SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
因爲開發需要,自己看了一些與單點登錄相關的資料,想要實現這個功能,不過鼓搗了幾天也沒有弄成功,後來自己另闢蹊徑利用過濾器實現了相應的功能。話不多說,代碼如下(過濾器):
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession session = servletRequest.getSession();
if (session.getAttribute("adminName") != null //登錄攔截,判斷用戶是否登錄
&& session.getAttribute("adminName") != "") {
chain.doFilter(request, response); //如果用戶已經登錄,就繼續用戶當前的請求
return;
} else {
String getQer = servletRequest.getQueryString();//獲取用戶請求鏈接裏面的參數,比如http://xxx.com?id=xxx這個鏈接的“id=xxx”這個參數
String requestUrl; //定義一個變量用戶保存用戶請求的URL
if (getQer == null || getQer == "") {// 如果請求參數爲空的話
requestUrl = servletRequest.getServletPath(); //獲取用戶請求的Url
} else {
requestUrl = servletRequest.getServletPath() + "?"
+ servletRequest.getQueryString(); //請求的相對url;// 請求參數
}
session.setAttribute("setRequestUrl", requestUrl);// 保存請求路徑到setRequestUrl
//System.out.println("我是getQer:" + getQer);
servletResponse.sendRedirect(servletRequest.getContextPath()
+ "/Admin/Login.jsp"); //跳轉到登錄頁面,讓用戶登錄
}
}
以上的代碼在獲取用戶請求路徑的同時也實現了用戶登錄過濾,防止未登錄的用戶進行一些非法操作;
接下來是登錄處理頁面的部分代碼:
session.setAttribute("adminName", adminName);//將用戶名保存在session中
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort() + path;//獲得當前項目的路徑
String getUrl = basePath
+ session.getAttribute("setRequestUrl");//獲取剛剛保存的請求地址
if (getUrl != null || getUrl != "") { //判斷用戶的請求路徑是否爲空,如果不爲空就跳轉到該頁面
response.sendRedirect(getUrl);
} else {
response.sendRedirect("Management\\index.jsp");
}
通過以上邏輯代碼,就可以實現單點登錄的功能了,希望給有需要的同道之人一些思路。
ps:新人小白,若有不當之處,歡迎指教。