SSO單點登錄

本文實現了Web-SSO單點登錄功能,實例中包含三個工程, SSOAuth, SSOWebDemo1, SSOWebDemo2, SSOAuth爲認證系統,使用SSOWebDemo1登錄系統時,要使用SSOAuth進行鑑權, 登錄上Demo1後,系統可實現自動登錄到Demo2的功能

本文開發工具: 

   MyEclipse10: https://pan.baidu.com/s/1eRPzTJG

   JDK1.7     : https://pan.baidu.com/s/1jHWJSdK

相關demo下載:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=490

1.認識SSO

    單點登錄(Single Sign On),簡稱爲 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。  

    單點登錄的機制其實是比較簡單的,用一個現實中的例子做比較。頤和園是北京著名的旅遊景點,也是我常去的地方。在頤和園內部有許多獨立的景點,例如“蘇州 街”、“佛香閣”和“德和園”,都可以在各個景點門口單獨買票。很多遊客需要遊玩所有的景點,這種買票方式很不方便,需要在每個景點門口排隊買票,錢包拿 進拿出的,容易丟失,很不安全。於是絕大多數遊客選擇在大門口買一張通票(也叫套票),就可以玩遍所有的景點而不需要重新再買票。他們只需要在每個景點門 口出示一下剛纔買的套票就能夠被允許進入每個獨立的景點。

2.SSO實現機制

    單點登錄的機制也一樣,如下圖所示,當用戶第一次訪問應用系統1的時候,因爲還沒有登錄,會被引導到認證系統中進行登錄(1);根據用戶提供的登錄信息,認證系統進行身份效驗,如果通過效驗,應該返回給用戶一個認證的憑據--ticket(2);用戶再訪問別的應用的時候(3,5)就會將這個ticket帶上,作爲自己認證的憑據,應用系統接受到請求之後會把ticket送到認證系統進行效驗,檢查ticket的合法性(4,6)。如果通過效驗,用戶就可以在不用再次登錄的情況下訪問應用系統2和應用系統3了。


統一的認證系統並不是說只有單個的認證服務器,如下圖所示,整個系統可以存在兩個以上的認證服務器,這些服務器甚至可以是不同的產品。認證服務器之間要通過標準的通訊協議,互相交換認證信息,就能完成更高級別的單點登錄。如下圖,當用戶在訪問應用系統1時,由第一個認證服務器進行認證後,得到由此服務器產生的ticket。當他訪問應用系統4的時候,認證服務器2能夠識別此ticket是由第一個服務器產生的,通過認證服務器之間標準的通訊協議(例如SAML)來交換認證信息,仍然能夠完成SSO的功能。


3. Web-SSO實現方法

    例如用戶在訪問頁面1的時候進行了登錄,客戶端(瀏覽器)的每個請求都是單獨的連接,當客戶再次訪問頁面2的時候,如何才能告訴Web服務器,客戶剛纔已經登錄過了呢?瀏覽器和服務器之間有約定:通過使用cookie技術來維護應用的狀態。Cookie是可以被Web服務器設置的字符串,並且可以保存在瀏覽器中。如下圖所示,當瀏覽器訪問了頁面1時,web服務器設置了一個cookie,並將這個cookie和頁面1一起返回給瀏覽器,瀏覽器接到cookie之後,就會保存起來,在它訪問頁面2的時候會把這個cookie也帶上,Web服務器接到請求時也能讀出cookie的值,根據cookie值的內容就可以判斷和恢復一些用戶的信息狀態。Web-SSO完全可以利用Cookie來完成用戶登錄信息的保存,將瀏覽器中的Cookie和上文中的Ticket結合起來,完成SSO的功能。


4. 實例概述

   本實例一共有三個Web工程, SSOAuth, SSOWebDemo1, SSOWebDemo2, 訪問SSOWebDemo1的jsp頁面時,demo1的應用程序會判斷是否登錄,如果未登錄,進入登錄頁面,如果已經登錄,顯示登錄人的基本信息; 同樣訪問SSOWebDemo2的jsp頁面時,也會像訪問SSOWebDemo1一樣。 SSOWebDemo1與SSOWebDemo2的跳轉的登錄頁面由SSOAuth提供, 用戶信息由SSOAuth進行校驗

   4.1訪問SSOWebDemo1路徑: http://localhost:8080/SSOWebDemo1/test.jsp

如果未登錄成功,跳轉到登錄頁面,見下圖

 如果已經登錄,則顯示登錄人信息, 見下圖


    同理 SSOWebDemo2

5. 代碼詳解(由於SSOWebDemo1與SSOWebDemo2類別,下面只講解SSOWebDemo1和SSOAuth)

   5.1 SSOWebDemo1的web.xml中配置jsp過濾器,訪問工程中頁面時,會被過濾器類SSOFilter攔截

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  3.     <filter>  
  4.         <filter-name>SSOFilter</filter-name>  
  5.         <filter-class>SSO.SSOFilter</filter-class>  
  6.         <!-- <init-param>  
  7.             <param-name>CookieName</param-name>  
  8.             <param-value>SsoTicket</param-value>  
  9.         </init-param>  
  10.         <init-param>  
  11.             <param-name>SSOServiceURL</param-name>  
  12.             <param-value>http://localhost:8080/SSOAuth/SSOAuth</param-value>  
  13.         </init-param>  
  14.         <init-param>  
  15.             <param-name>SSOLoginPage</param-name>  
  16.             <param-value>http://localhost:8080/SSOAuth/login.jsp</param-value>  
  17.         </init-param> -->  
  18.         </filter>  
  19.     <filter-mapping>  
  20.         <filter-name>SSOFilter</filter-name>  
  21.         <url-pattern>*.jsp</url-pattern>  
  22.     </filter-mapping>  
  23.        
  24.     <session-config>  
  25.         <session-timeout>  
  26.             60  
  27.         </session-timeout>  
  28.     </session-config>  
  29.     <welcome-file-list>  
  30.     <welcome-file>  
  31.             index.jsp  
  32.         </welcome-file>  
  33.     </welcome-file-list>  
  34. </web-app>  

  5.2 SSOFilter攔截器中獲取瀏覽器中所有cookie信息,判斷是否有需要處理的cookie(根據名稱), 如果沒有,則認爲其未登錄, 頁面跳轉到登錄頁面;  如果cookie列表有需要處理的cookie,調用SSOAuth接口判斷cookie是否有效,如果無效,由跳轉到登錄頁面, 如果有效,SSOAuth返回用戶基本信息給SSOWebDemo1,將用戶信息顯示在頁面上

[html] view plain copy
  1. package SSO;  
  2.    
  3. import java.io.IOException;  
  4. import java.io.PrintStream;  
  5. import java.io.PrintWriter;  
  6. import java.io.StringWriter;  
  7.    
  8. import javax.servlet.Filter;  
  9. import javax.servlet.FilterChain;  
  10. import javax.servlet.FilterConfig;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletRequest;  
  13. import javax.servlet.ServletResponse;  
  14. import javax.servlet.http.Cookie;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.    
  18. import org.apache.commons.httpclient.HttpClient;  
  19. import org.apache.commons.httpclient.methods.GetMethod;  
  20.    
  21. import com.alibaba.fastjson.JSON;  
  22.    
  23. public class SSOFilter implements Filter {  
  24.     private FilterConfig filterConfig = null;  
  25.        
  26.    
  27.     public void doFilter(ServletRequest req, ServletResponse res,  
  28.             FilterChain chain) throws IOException, ServletException {  
  29.         log("SSOFilter:doFilter()");  
  30.    
  31.         HttpServletRequest request = (HttpServletRequest) req;  
  32.         HttpServletResponse response = (HttpServletResponse) res;  
  33.         String result = "failed";  
  34.         String url = request.getRequestURL().toString();  
  35.         String qstring = request.getQueryString();  
  36.         log("SSOFilter: 訪問路徑:" + url);  
  37.         log("SSOFilter: 查詢參數:" + qstring);  
  38.            
  39.         if (qstring == null)  
  40.             qstring = "";  
  41.         String cookieValue = "";  
  42.         //獲取所有cookie信息  
  43.         Cookie[] diskCookies = request.getCookies();  
  44.         if (diskCookies != null) {  
  45.             for (int i = 0; i < diskCookies.length; i++) {  
  46.                     //根據名稱判斷是否含有需要處理的cookie  
  47.                 if (diskCookies[i].getName().equals(Constant.CookieName)) {  
  48.                     cookieValue = diskCookies[i].getValue();  
  49.                     log("SSOFilter: cookie[" + Constant.CookieName + "," + cookieValue + "]");  
  50.                     //將獲取的cookie值發送給SSOAuth進行校驗,  
  51.                     //無效返回failed, 有效返回用戶信息  
  52.                     result = SSOService(cookieValue);  
  53.                     log("SSOFilter: SSOAuth 返回值:" + result);  
  54.                     break;  
  55.                 }  
  56.             }  
  57.         }  
  58.    
  59.         if (result.equals("failed")) {  
  60.                 //頁面跳轉到SSOAuth中的登錄頁面, goto對應的url爲登錄成功後跳轉的頁面路徑  
  61.             response.sendRedirect(Constant.SSOLoginPage + "?goto=" + url);  
  62.         } else if (qstring.indexOf("logout") > 1) {  
  63.             log("SSOFilter: logout action!");  
  64.             logoutService(cookieValue);  
  65.             response.sendRedirect(Constant.SSOLoginPage + "?goto=" + url);  
  66.         } else {  
  67.                 //將用戶的json串信息 反轉 爲User對象  
  68.             User user = JSON.parseObject(result, User.class);  
  69.             request.setAttribute("SSOUser", user);  
  70.             Throwable problem = null;  
  71.             try {  
  72.                 chain.doFilter(req, res);  
  73.             } catch (Throwable t) {  
  74.                 problem = t;  
  75.                 t.printStackTrace();  
  76.             }  
  77.             if (problem != null) {  
  78.                 if ((problem instanceof ServletException))  
  79.                     throw ((ServletException) problem);  
  80.                 if ((problem instanceof IOException))  
  81.                     throw ((IOException) problem);  
  82.                 sendProcessingError(problem, res);  
  83.             }  
  84.         }  
  85.     }  
  86.    
  87.     public FilterConfig getFilterConfig() {  
  88.         return this.filterConfig;  
  89.     }  
  90.    
  91.     public void setFilterConfig(FilterConfig filterConfig) {  
  92.         this.filterConfig = filterConfig;  
  93.     }  
  94.    
  95.     public void destroy() {  
  96.     }  
  97.    
  98.     public void init(FilterConfig filterConfig) {  
  99.         this.filterConfig = filterConfig;  
  100.         if (filterConfig != null) {  
  101.             log("SSOFilter:Initializing filter");  
  102.         }  
  103.    
  104.         /*獲取web.xml的配置信息*/  
  105.         /*Constant.CookieName = filterConfig.getInitParameter("CookieName");  
  106.         Constant.SSOServiceURL = filterConfig.getInitParameter("SSOServiceURL");  
  107.         Constant.SSOLoginPage = filterConfig.getInitParameter("SSOLoginPage");*/  
  108.     }  
  109.    
  110.     public String toString() {  
  111.         if (this.filterConfig == null)  
  112.             return "SSOFilter()";  
  113.         StringBuffer sb = new StringBuffer("SSOFilter(");  
  114.         sb.append(this.filterConfig);  
  115.         sb.append(")");  
  116.         return sb.toString();  
  117.     }  
  118.    
  119.     private void sendProcessingError(Throwable t, ServletResponse response) {  
  120.         String stackTrace = getStackTrace(t);  
  121.    
  122.         if ((stackTrace != null) && (!stackTrace.equals(""))) {  
  123.             try {  
  124.                 response.setContentType("text/html");  
  125.                 PrintStream ps = new PrintStream(response.getOutputStream());  
  126.                 PrintWriter pw = new PrintWriter(ps);  
  127.                 pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n");  
  128.    
  129.                 pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");  
  130.                 pw.print(stackTrace);  
  131.                 pw.print("</pre></body>\n</html>");  
  132.                 pw.close();  
  133.                 ps.close();  
  134.                 response.getOutputStream().close();  
  135.             } catch (Exception ex) {  
  136.             }  
  137.         } else  
  138.             try {  
  139.                 PrintStream ps = new PrintStream(response.getOutputStream());  
  140.                 t.printStackTrace(ps);  
  141.                 ps.close();  
  142.                 response.getOutputStream().close();  
  143.             } catch (Exception ex) {  
  144.             }  
  145.     }  
  146.    
  147.     public static String getStackTrace(Throwable t) {  
  148.         String stackTrace = null;  
  149.         try {  
  150.             StringWriter sw = new StringWriter();  
  151.             PrintWriter pw = new PrintWriter(sw);  
  152.             t.printStackTrace(pw);  
  153.             pw.close();  
  154.             sw.close();  
  155.             stackTrace = sw.getBuffer().toString();  
  156.         } catch (Exception ex) {  
  157.         }  
  158.         return stackTrace;  
  159.     }  
  160.    
  161.     /**  
  162.      * 使用HttpClient向SSOAuth鑑權  
  163.      * @param cookievalue  
  164.      * @return  
  165.      * @throws IOException  
  166.      */  
  167.     private String SSOService(String cookievalue) throws IOException {  
  168.         String authAction = "?action=authcookie&cookiename=";  
  169.         HttpClient httpclient = new HttpClient();  
  170.         GetMethod httpget = new GetMethod(Constant.SSOServiceURL + authAction + cookievalue);  
  171.         try {  
  172.             httpclient.executeMethod(httpget);  
  173.             String result = httpget.getResponseBodyAsString();  
  174.             return result;  
  175.         } finally {  
  176.             httpget.releaseConnection();  
  177.         }  
  178.     }  
  179.    
  180.     /**  
  181.      * 退出,讓SSOAuth刪除用戶鑑權信息  
  182.      */  
  183.     private void logoutService(String cookievalue) throws IOException {  
  184.         String authAction = "?action=logout&cookiename=";  
  185.         HttpClient httpclient = new HttpClient();  
  186.         GetMethod httpget = new GetMethod(Constant.SSOServiceURL + authAction + cookievalue);  
  187.         try {  
  188.             httpclient.executeMethod(httpget);  
  189.             httpget.getResponseBodyAsString();  
  190.         } finally {  
  191.             httpget.releaseConnection();  
  192.         }  
  193.     }  
  194.    
  195.     public void log(String msg) {  
  196.         this.filterConfig.getServletContext().log("[工程1]" + msg);  
  197.     }  
  198. }  
5.3 基本常量信息

[html] view plain copy
  1. package SSO;  
  2.    
  3. public class Constant {  
  4.     public static String CookieName = "SsoTicket";  
  5.     public static String SSOServiceURL = "http://localhost:8080/SSOAuth/SSOAuth";  
  6.     public static String SSOLoginPage = "http://localhost:8080/SSOAuth/login.jsp";  
  7.     public static final boolean debug = true;  
  8. }  
 5.4 SSOWebDemo1中訪問的jsp頁面

[html] view plain copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>  
  4. <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>  
  5. <%@ page import="SSO.User" %>  
  6. <%  
  7. String contextPath = request.getContextPath();  
  8. %>  
  9. <!DOCTYPE html>  
  10. <html>  
  11.    
  12. <head>  
  13. <title>系統1</title>  
  14. <link rel="STYLESHEET" type="text/css" href="css.css">  
  15. </head>  
  16.    
  17.    
  18. <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">  
  19.    
  20. <br>  
  21.    
  22. <div>  
  23. <h1>系統1登錄成功</h1>  
  24. <table border="0" cellpadding="0" cellspacing="0" width="748">  
  25. <tr>  
  26. <td height="100" width="300">  
  27.                 <h3>Welcome!</h3>  
  28.                 <h4>姓名: <%=((User)request.getAttribute("SSOUser")).getUserName()%></h4>  
  29.                 <h4>密碼: <%=((User)request.getAttribute("SSOUser")).getPassword()%></h4>  
  30.                 <h4>年齡: <%=((User)request.getAttribute("SSOUser")).getAge()%></h4>  
  31.                 <h4>地址: <%=((User)request.getAttribute("SSOUser")).getAddress()%></h4>  
  32. <h3>Success Access Web SSO Demo1</h3><br>  
  33. <h3><a href="test.jsp?action=logout">LogOut</a></h3>  
  34. </td>  
  35. </tr>  
  36.                   
  37.                    
  38. </table>  
  39.    
  40.         
  41. </div>  
  42.    
  43. </body>  
  44. </html>  

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

6.下面講解SSOAuth

  6.1 web.xml中配置servlet,用於向SSOWebDemo1,SSOWebDemo2提供接口調用, 

      接口功能: SSOWebDemo1根據cookie值到SSOAuth中獲取登錄人基本信息;

                SSOAuth自身的登錄退出操作

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  3.     <servlet>  
  4.         <servlet-name>SSOAuth</servlet-name>  
  5.         <servlet-class>SSO.SSOAuth</servlet-class>  
  6.         <!-- <init-param>  
  7.             <param-name>domainname</param-name>  
  8.             <param-value>localhost</param-value>  
  9.         </init-param>  
  10.         <init-param>  
  11.             <param-name>cookiename</param-name>  
  12.             <param-value>SsoTicket</param-value>  
  13.         </init-param> -->  
  14.         </servlet>  
  15.     <servlet-mapping>  
  16.         <servlet-name>SSOAuth</servlet-name>  
  17.         <url-pattern>/SSOAuth</url-pattern>  
  18.     </servlet-mapping>  
  19.     <session-config>  
  20.         <session-timeout>  
  21.             30  
  22.         </session-timeout>  
  23.     </session-config>  
  24.     <welcome-file-list>  
  25.     <welcome-file>  
  26.             index.jsp  
  27.         </welcome-file>  
  28.     </welcome-file-list>  
  29. </web-app>  

 6.2 SSOAuth類詳解

     SSOAuth初始一個線程同步對象 ConcurrentMap SSOIDs; 此對象存儲key: cookie, value: 用戶信息

     當用戶登錄時,判斷用戶的用戶名與密碼是否正確,如果正確, 使用相應算法生成cookie值 和 用戶信息保存在SSOIDs中;

     登錄成功後,將cookie信息讓瀏覽器進行保存;

     SSOWebDemo1中發出SSO校驗請求,根據傳遞的cookie參數值判斷是否有效,如果有效,將對應的用戶信息返回;

     SSOWebDemo1中發出退出操作請求,根據cookie參數來刪除SSOIDs對應的用戶信息

[html] view plain copy
  1. package SSO;  
  2.    
  3. import java.io.IOException;  
  4. import java.io.PrintStream;  
  5. import java.io.PrintWriter;  
  6. import java.util.Date;  
  7. import java.util.concurrent.ConcurrentHashMap;  
  8. import java.util.concurrent.ConcurrentMap;  
  9. import javax.servlet.RequestDispatcher;  
  10. import javax.servlet.ServletConfig;  
  11. import javax.servlet.ServletContext;  
  12. import javax.servlet.ServletException;  
  13. import javax.servlet.http.Cookie;  
  14. import javax.servlet.http.HttpServlet;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.    
  18. import com.alibaba.fastjson.JSON;  
  19.    
  20. public class SSOAuth extends HttpServlet {  
  21.     private static ConcurrentMap SSOIDs;  
  22.     protected void processRequest(HttpServletRequest request,  
  23.             HttpServletResponse response) throws ServletException, IOException {  
  24.         PrintWriter out = response.getWriter();  
  25.         String action = request.getParameter("action");  
  26.         String gotoURL = request.getParameter("goto");  
  27.         String result = "failed";  
  28.         if (action == null) {  
  29.             userLogin(request, response);  
  30.         } else if (action.equals("authcookie")) {  
  31.             String myCookie = request.getParameter("cookiename");  
  32.             if (myCookie != null)  
  33.                 result = authCookie(myCookie);  
  34.             out.print(result);  
  35.             out.close();  
  36.         } else if (action.equals("logout")) {  
  37.             String myCookie = request.getParameter("cookiename");  
  38.             logout(myCookie);  
  39.             out.close();  
  40.         }  
  41.     }  
  42.    
  43.     public static String authCookie(String value) {  
  44.         User user= (User) SSOIDs.get(value);  
  45.         String strUserInfo = "";  
  46.         if (user == null) {  
  47.             strUserInfo = "failed";  
  48.             System.out.println("Authentication failed!");  
  49.         } else {  
  50.             strUserInfo = JSON.toJSONString(user);  
  51.             System.out.println("Authentication success!");  
  52.         }  
  53.         return strUserInfo;  
  54.     }  
  55.    
  56.     /**  
  57.      * 校驗用戶登錄信息是否正確  
  58.      * @param userName  
  59.      * @param password  
  60.      * @return  
  61.      */  
  62.     public static User authUser(String userName, String password) {  
  63.         if(null == userName || null == password){  
  64.             return null;  
  65.         }  
  66.            
  67.         User loginUser = null;  
  68.         for(User user : Constant.UserAccounts){  
  69.             if(userName.equals(user.getUserName()) && password.equals(user.getPassword())){  
  70.                 loginUser = user;  
  71.             }  
  72.         }  
  73.            
  74.         return loginUser;  
  75.     }  
  76.            
  77.    
  78.        
  79.     protected void doGet(HttpServletRequest request,  
  80.             HttpServletResponse response) throws ServletException, IOException {  
  81.         processRequest(request, response);  
  82.     }  
  83.    
  84.     protected void doPost(HttpServletRequest request,  
  85.             HttpServletResponse response) throws ServletException, IOException {  
  86.         processRequest(request, response);  
  87.     }  
  88.    
  89.     public String getServletInfo() {  
  90.         return "Short description";  
  91.     }  
  92.    
  93.     public void init(ServletConfig config) throws ServletException {  
  94.         super.init(config);  
  95.         /*this.domainname = config.getInitParameter("domainname");  
  96.         this.cookiename = config.getInitParameter("cookiename");*/  
  97.         SSOIDs = new ConcurrentHashMap();  
  98.     }  
  99.    
  100.     private static String createUID(String userName) {  
  101.         Date now = new Date();  
  102.         long time = now.getTime();  
  103.         return userName + time;  
  104.     }  
  105.    
  106.     /**  
  107.      *   
  108.      * @param UID  
  109.      */  
  110.     private void logout(String UID) {  
  111.         System.out.println("Logout for " + UID);  
  112.         SSOIDs.remove(UID);  
  113.     }  
  114.    
  115.     /**  
  116.      *   
  117.      * @param request  
  118.      * @param response  
  119.      * @throws ServletException  
  120.      * @throws IOException  
  121.      */  
  122.     private void userLogin(HttpServletRequest request,  
  123.             HttpServletResponse response) throws ServletException, IOException {  
  124.         String userName = request.getParameter("username");  
  125.         String password = request.getParameter("password");  
  126.            
  127.            
  128.         User user = authUser(userName, password);  
  129.         if (null == user){  
  130.             getServletContext().getRequestDispatcher("/failed.html").forward(request, response);  
  131.         }else{  
  132.             String gotoURL = request.getParameter("goto");  
  133.             String newID = createUID(userName);  
  134.             SSOIDs.put(newID, user);  
  135.             add2Cookie(response, Constant.CookieName, newID, 60 * 1000);  
  136.             System.out.println("login success, goto back url:" + gotoURL);  
  137.             if (gotoURL != null) {  
  138.                 PrintWriter out = response.getWriter();  
  139.                 response.sendRedirect(gotoURL);  
  140.                 out.close();  
  141.             }  
  142.         }  
  143.     }  
  144.    
  145.     /**  
  146.      *   
  147.      * @param response  
  148.      * @param cookieName  
  149.      * @param cookieValue  
  150.      * @param maxAge  
  151.      */  
  152.     private void add2Cookie(HttpServletResponse response, String cookieName,  
  153.             String cookieValue, int maxAge) {  
  154.         Cookie cookie = new Cookie(cookieName, cookieValue);  
  155.         cookie.setDomain(Constant.DomainName);  
  156.         cookie.setPath("/");  
  157.         cookie.setMaxAge(maxAge);  
  158.         response.addCookie(cookie);  
  159.     }  
  160. }  

  6.3 登錄頁面

[html] view plain copy
  1. <%@page contentType="text/html"%>  
  2. <%@page pageEncoding="UTF-8"%>  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.    
  6. <head>  
  7. <title>登錄</title>  
  8. <link rel="STYLESHEET" type="text/css" href="css.css">  
  9. </head>  
  10.    
  11.    
  12. <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">  
  13.    
  14. <br>  
  15.    
  16. <div>  
  17.    
  18. <table border="0" cellpadding="0" cellspacing="0" width="748">  
  19. <tr>  
  20. <td height="85" width="300">  
  21. <h3>統一登錄頁面</h3>  
  22. <br>  
  23. <h1>登錄頁面</h1></td>  
  24. </tr>  
  25.    
  26. </table>  
  27.    
  28. <table border="0" cellpadding="0" cellspacing="0" width="748">  
  29. <tr>  
  30. <td>  
  31. <table border='0' cellspacing='0' cellpadding='0'>  
  32. <tr>  
  33. <td width='598' valign='top'>  
  34. <p>  
  35. <form action='/SSOAuth/SSOAuth' method='post'>  
  36. 用戶名: <input type='text' name='username'><br><br>  
  37. 密   碼: <input type='password' name='password'> <br>  
  38. <input type='hidden' name='goto' value=<%=request.getParameter("goto")%>></input><br>   
  39. <input type='submit' value='登錄' style="width:100px;"></input>  
  40. </form>  
  41. </p></td>  
  42. </tr>  
  43. </table></td>  
  44. </tr>  
  45. </tr>  
  46. </table>  
  47. </div>  
  48.    
  49. </body>  
  50. </html>  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章