利用過濾器chain.doFilter(req,resp)實現偽單點登入以及登入攔截
阿新 • • 發佈:2018-12-14
單點登入(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:新人小白,若有不當之處,歡迎指教。