javaWeb簡單的單點登入sso實現方法
阿新 • • 發佈:2019-01-04
總結一個簡單的sso單點登入實現方法,先上一張思路圖:
思路不復雜,在一個Filter中如下:
String baseUrl="你的基礎系統路徑";//比如是120.24.270.95:8080 String host=request.getHeader("HOST"); String url=request.getRequestURI(); if(request.getQueryString()!=null){ url=url+"?"+request.getQueryString(); } /***********單點登入***********/ if(session.getAttribute(session_user_KEY)==null){//獲取session中使用者的登入資訊 String sso=request.getParameter("sso"); if(sso!=null && sso.equals("1")){//sso標記 String userName=request.getParameter("userName"); String password=request.getParameter("password"); ssoLoginSrv.login(userName, password, request);//如果有sso標記,獲取引數中的使用者名稱和密碼,判斷是否合法,合法則可免登。 }else{ /*加上sso標誌*/ if(ex.indexOf("?")>0){ ex=ex+"&sso=1"; }else{ ex=ex+"?sso=1"; } //帶著url轉發到基礎系統 response.sendRedirect(baseUrl+"/loginAction!login.do?url=" + URLEncoder.encode("http://" + host + url, "utf8")); return; } }
轉發到基礎系統,如果基礎系統已登入,則子系統可實現免登,
是Action中的一個方法,執行完帶著使用者名稱密碼轉回去,
如下方法:
在strust.xml中配置轉發到url,帶著使用者名稱密碼回到一開始的子系統,還是被Filter攔截。public String login(){ Map session=ActionContext.getContext().getSession(); User loginUser=(User)session.get(session_user_KEY); try{ if(loginUser==null){ loginUser=userSrv.login(user.getUserName(), user.getPassword()); } }catch (Exception e) { log.error(e.getMessage()); this.setMsg(e.getMessage()); return "loginNo"; } if(isNull(url)){ url="/index.jsp"; }else if(url.indexOf("sso=1")>0){ String str1=DesUtil.encode(loginUser.getUserName(), ssoLoginPwdKey, "utf8"); String str2=DesUtil.encode(loginUser.getPassword(),ssoLoginPwdKey, "utf8"); url=url+"&userName="+str1+"&password="+str2; } return "loginOk"; }
再次進入子系統Filter的時候,拿到sso標記,和使用者名稱密碼,驗證是否合法,合法則往下執行,不合法跳轉到登入頁面。
歡迎掃碼關注微信公眾號:擒賊先情王(qingshang733)