`
m635674608
  • 浏览: 5028693 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

自己动手写SSO(单点登录)

 
阅读更多

SSO在我们的应用中非常常见,例如我们在OA系统登录了,我们就可以直接进入采购系统,不需要再登录了,这样使我们非常方便。现在网上也有很多实现方法,于是乎我也想写一个看看。我主要用到的是cookie的机制。在此,分享给大家,同时提供源代码下载

 

 

 

进入主题:

 

工程说明

 

SSO的实现一般是会有一个SSO Server,也会叫认证中心,同时也会有被认证的系统,如OA系统、采购系统等,他们就相当于SSO Server的client。

 

 

 

为了更形象体现SSO,我写的SSO是有三个工程:一个SSO Server端口为8081,一个OA系统端口为8082,一个采购系统端口为8083。如图:

 


 流程介绍

 

在整个SSO流程当,有两个流程非常重要,第一个是用户没有登录系统到登录系统的过程;第二是用户在一个系统当中已经登录(例如在OA系统中登录 了),但又想进入另一个系统(例如进入PRO系统)的过程,如果把这两个过程搞定了,那么SSO也就搞定了。我画了两幅图来说明这两个过程。

 

先看用户没有登录系统到登录系统的过程,如图:

 



 1:用户通过URL访问OA系统。

 

 2:在OA系统中的filter发现这个URL没有ticket(你暂且就把ticket看做是门票),此时就会跳转到SSO Server。

 

 3:SSO Server中的filter发现该客户端中的cookie中没有相应信息,也即是一个没有登录的用户,那么会跳转到登录页面。

 

 4:用户在登录页面填写相应信息,然后通过post方式提交到SSO Server中。

 

 5:SSO Server会校验用户信息(我为了快,我的校验方式就是要用户名为:cloud,同时密码为:cloud),同时在cookie中放username。

 

 6:将生成ticket和username放到JVMCache中,在实际项目应该放到Memcached中,它的用处等下分析。

 

7,8:就是在用户访问OA系统的URL基础上加上了一个ticket参数,这样跳转到OA系统。

 

(此时进入OA系统时,filter发现URL是带ticket的,则filter会根据带过来的ticket并通过HttpClient的形式去 调用SSO Server中的TicektServlet,这样就会返回用户名,其实这个用户名就是从JVMCache拿到的,同时马上将这个ticket从 JVMCache中移除,这样保证一个ticket只会用一次,然后把返回的用户名放到session中)

 

 9:session中有了用户名,说明用户登录成功了,则会去本应该返问的servlet。

 

10,11:将OA系统返回的视图给用户。

 

 

 

第二过程,用户已经登录成功了,但要访问另一个系统,如图:

 



  1:用户通过URL访问PRO系统。

 

  2:在PRO系统中的filter发现这个URL没有ticket,此时就会跳转到SSO Server。此时,由于用户登录了,所以cookie中有相应的信息(例如用户名),此时SSO Server中的filter会生成一个ticket。

 

 3:将生成的ticket和username放到JVMCache中。

 

 4:就是在用户访问PRO系统的URL基础上加上了一个ticket参数,这样跳转到PRO系统。

 

(此时进入PRO系统时,filter发现URL是带ticket的,则filter会根据带过来的ticket并通过HttpClient的形式 去调用SSO Server中的TicektServlet,这样就会返回用户名,其实这个用户名就是从JVMCache拿到的,同时马上将这个ticket从 JVMCache中移除,这样保证一个ticket只会用一次,然后把返回的用户名放到session中)

 

 5:session中有了用户名,说明用户登录成功了,则会去本应该返问的servlet。

 

5,7:将PRO系统返回的视图给用户。

 

 

 

关键代码

 

 

 

先看SSO Server工程中的代码:

 

pom.xml

 

(注意:端口为8081)

 

Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.cloud.sso.server</groupId>  
  5.   <artifactId>sso-server</artifactId>  
  6.   <packaging>war</packaging>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <name>sso-server Maven Webapp</name>  
  9.   <url>http://maven.apache.org</url>  
  10.   <dependencies>  
  11.       <dependency>  
  12.           <groupId>javax.servlet</groupId>  
  13.           <artifactId>servlet-api</artifactId>  
  14.           <version>2.5</version>  
  15.           <scope>provided</scope>  
  16.       </dependency>  
  17.   </dependencies>  
  18.   <build>  
  19.     <finalName>sso-server</finalName>  
  20.     <plugins>  
  21.       <plugin>  
  22.           <groupId>org.mortbay.jetty</groupId>  
  23.           <artifactId>jetty-maven-plugin</artifactId>  
  24.           <version>8.1.9.v20130131</version>  
  25.           <configuration>  
  26.               <stopKey>stop</stopKey>  
  27.               <stopPort>6000</stopPort>  
  28.               <webAppConfig>  
  29.                   <contextPath>/sso</contextPath>  
  30.               </webAppConfig>  
  31.               <scanIntervalSeconds>4</scanIntervalSeconds>  
  32.               <connectors>  
  33.                   <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">  
  34.                       <port>8081</port>  
  35.                       <maxIdleTime>60000</maxIdleTime>  
  36.                   </connector>  
  37.               </connectors>  
  38.           </configuration>  
  39.       </plugin>  
  40.     </plugins>  
  41.   </build>  
  42. </project>  

 

 

 

SSO Server中的filter

 

SSOServerFilter.java

 

Java代码  收藏代码
  1. package com.cloud.sso.server.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.Cookie;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. import com.cloud.sso.server.JVMCache;  
  16.   
  17. public class SSOServerFilter implements Filter {  
  18.   
  19.     @Override  
  20.     public void destroy() {  
  21.     }  
  22.   
  23.     @Override  
  24.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  25.         HttpServletRequest request = (HttpServletRequest) servletRequest;  
  26.         HttpServletResponse response = (HttpServletResponse) servletResponse;  
  27.         String service = request.getParameter("service");  
  28.         String ticket = request.getParameter("ticket");  
  29.         Cookie[] cookies = request.getCookies();  
  30.         String username = "";  
  31.         if (null != cookies) {  
  32.             for (Cookie cookie : cookies) {  
  33.                 if ("sso".equals(cookie.getName())) {  
  34.                     username = cookie.getValue();  
  35.                     break;  
  36.                 }  
  37.             }  
  38.         }  
  39.   
  40.         if (null == service && null != ticket) {  
  41.             filterChain.doFilter(servletRequest, servletResponse);  
  42.             return;  
  43.         }  
  44.   
  45.         if (null != username && !"".equals(username)) {  
  46.             long time = System.currentTimeMillis();  
  47.             String timeString = username + time;  
  48.             JVMCache.TICKET_AND_NAME.put(timeString, username);  
  49.             StringBuilder url = new StringBuilder();  
  50.             url.append(service);  
  51.             if (0 <= service.indexOf("?")) {  
  52.                 url.append("&");  
  53.             } else {  
  54.                 url.append("?");  
  55.             }  
  56.             url.append("ticket=").append(timeString);  
  57.             response.sendRedirect(url.toString());  
  58.         } else {  
  59.             filterChain.doFilter(servletRequest, servletResponse);  
  60.         }  
  61.     }  
  62.   
  63.     @Override  
  64.     public void init(FilterConfig arg0) throws ServletException {  
  65.     }  
  66.   
  67. }  

 

 

 

两个servlet:

 

LoginServlet.java

 

Java代码  收藏代码
  1. package com.cloud.sso.server.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.Cookie;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import com.cloud.sso.server.JVMCache;  
  12.   
  13. public class LoginServlet extends HttpServlet {  
  14.     private static final long serialVersionUID = -3170191388656385924L;  
  15.   
  16.     @Override  
  17.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  18.         this.doPost(request, response);  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  23.         String username = request.getParameter("username");  
  24.         String password = request.getParameter("password");  
  25.         String service = request.getParameter("service");  
  26.   
  27.         if ("cloud".equals(username) && "cloud".equals(password)) {  
  28.             Cookie cookie = new Cookie("sso", username);  
  29.             cookie.setPath("/");  
  30.             response.addCookie(cookie);  
  31.   
  32.             long time = System.currentTimeMillis();  
  33.             String timeString = username + time;  
  34.             JVMCache.TICKET_AND_NAME.put(timeString, username);  
  35.   
  36.             if (null != service) {  
  37.                 StringBuilder url = new StringBuilder();  
  38.                 url.append(service);  
  39.                 if (0 <= service.indexOf("?")) {  
  40.                     url.append("&");  
  41.                 } else {  
  42.                     url.append("?");  
  43.                 }  
  44.                 url.append("ticket=").append(timeString);  
  45.                 response.sendRedirect(url.toString());  
  46.             } else {  
  47.                 response.sendRedirect("/sso/index.jsp");  
  48.             }  
  49.         } else {  
  50.             response.sendRedirect("/sso/index.jsp?service=" + service);  
  51.         }  
  52.     }  
  53.   
  54. }  

 

 TicketServlet.java

 

Java代码  收藏代码
  1. package com.cloud.sso.server.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import com.cloud.sso.server.JVMCache;  
  12.   
  13. public class TicketServlet extends HttpServlet {  
  14.     private static final long serialVersionUID = 5964206637772848290L;  
  15.   
  16.     @Override  
  17.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  18.         super.doGet(request, response);  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  23.         String ticket = request.getParameter("ticket");  
  24.         String username = JVMCache.TICKET_AND_NAME.get(ticket);  
  25.         JVMCache.TICKET_AND_NAME.remove(ticket);  
  26.         PrintWriter writer = response.getWriter();  
  27.         writer.write(username);  
  28.     }  
  29.   
  30. }  

 

 

 

JVMCache.java

 

Java代码  收藏代码
  1. package com.cloud.sso.server;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. public class JVMCache {  
  7.   
  8.     public static Map<String, String> TICKET_AND_NAME = new HashMap<String, String>();  
  9. }  

 

 

 

web.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.     <welcome-file-list>  
  4.         <welcome-file>index.jsp</welcome-file>  
  5.     </welcome-file-list>  
  6.   
  7.     <filter>  
  8.         <filter-name>ssoServerFilter</filter-name>  
  9.         <filter-class>com.cloud.sso.server.filter.SSOServerFilter</filter-class>  
  10.     </filter>  
  11.     <filter-mapping>  
  12.         <filter-name>ssoServerFilter</filter-name>  
  13.         <url-pattern>/*</url-pattern>  
  14.     </filter-mapping>  
  15.   
  16.     <servlet>  
  17.         <servlet-name>login</servlet-name>  
  18.         <servlet-class>com.cloud.sso.server.servlet.LoginServlet</servlet-class>  
  19.     </servlet>  
  20.     <servlet-mapping>  
  21.         <servlet-name>login</servlet-name>  
  22.         <url-pattern>/user/login</url-pattern>  
  23.     </servlet-mapping>  
  24.   
  25.     <servlet>  
  26.         <servlet-name>ticket</servlet-name>  
  27.         <servlet-class>com.cloud.sso.server.servlet.TicketServlet</servlet-class>  
  28.     </servlet>  
  29.     <servlet-mapping>  
  30.         <servlet-name>ticket</servlet-name>  
  31.         <url-pattern>/ticket</url-pattern>  
  32.     </servlet-mapping>  
  33. </web-app>  

 

 

 

下面是OA系统中的代码:

 

pom.xml

 

(注意:端口为8082)

 

Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.cloud.sso.oa</groupId>  
  5.   <artifactId>sso-oa</artifactId>  
  6.   <packaging>war</packaging>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <name>sso-oa Maven Webapp</name>  
  9.   <url>http://maven.apache.org</url>  
  10.   <dependencies>  
  11.       <dependency>  
  12.           <groupId>javax.servlet</groupId>  
  13.           <artifactId>servlet-api</artifactId>  
  14.           <version>2.5</version>  
  15.           <scope>provided</scope>  
  16.       </dependency>  
  17.       <dependency>  
  18.           <groupId>commons-httpclient</groupId>  
  19.           <artifactId>commons-httpclient</artifactId>  
  20.           <version>3.1</version>   
  21.       </dependency>  
  22.   </dependencies>  
  23.   <build>  
  24.     <finalName>sso-oa</finalName>  
  25.     <plugins>  
  26.       <plugin>  
  27.           <groupId>org.mortbay.jetty</groupId>  
  28.           <artifactId>jetty-maven-plugin</artifactId>  
  29.           <version>8.1.9.v20130131</version>  
  30.           <configuration>  
  31.               <stopKey>stop</stopKey>  
  32.               <stopPort>6000</stopPort>  
  33.               <webAppConfig>  
  34.                   <contextPath>/oa</contextPath>  
  35.               </webAppConfig>  
  36.               <scanIntervalSeconds>4</scanIntervalSeconds>  
  37.               <connectors>  
  38.                   <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">  
  39.                       <port>8082</port>  
  40.                       <maxIdleTime>60000</maxIdleTime>  
  41.                   </connector>  
  42.               </connectors>  
  43.           </configuration>  
  44.       </plugin>  
  45.     </plugins>  
  46.   </build>  
  47. </project>  

 

 

 

OA系统中的filter:

 

SSOClientFilter.java

 

Java代码  收藏代码
  1. package com.cloud.sso.oa.filter;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URLEncoder;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14. import javax.servlet.http.HttpSession;  
  15.   
  16. import org.apache.commons.httpclient.HttpClient;  
  17. import org.apache.commons.httpclient.methods.PostMethod;  
  18.   
  19. public class SSOClientFilter implements Filter {  
  20.   
  21.     @Override  
  22.     public void destroy() {  
  23.     }  
  24.   
  25.     @Override  
  26.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  27.         HttpServletRequest request = (HttpServletRequest) servletRequest;  
  28.         HttpServletResponse response = (HttpServletResponse) servletResponse;  
  29.         HttpSession session = request.getSession();  
  30.         String username = (String) session.getAttribute("username");  
  31.         String ticket = request.getParameter("ticket");  
  32.         String url = URLEncoder.encode(request.getRequestURL().toString(), "UTF-8");  
  33.   
  34.         if (null == username) {  
  35.             if (null != ticket && !"".equals(ticket)) {  
  36.                 PostMethod postMethod = new PostMethod("http://localhost:8081/sso/ticket");  
  37.                 postMethod.addParameter("ticket", ticket);  
  38.                 HttpClient httpClient = new HttpClient();  
  39.                 try {  
  40.                     httpClient.executeMethod(postMethod);  
  41.                     username = postMethod.getResponseBodyAsString();  
  42.                     postMethod.releaseConnection();  
  43.                 } catch (Exception e) {  
  44.                     e.printStackTrace();  
  45.                 }  
  46.                 if (null != username && !"".equals(username)) {  
  47.                     session.setAttribute("username", username);  
  48.                     filterChain.doFilter(request, response);  
  49.                 } else {  
  50.                     response.sendRedirect("http://localhost:8081/sso/index.jsp?service=" + url);  
  51.                 }  
  52.             } else {  
  53.                 response.sendRedirect("http://localhost:8081/sso/index.jsp?service=" + url);  
  54.             }  
  55.         } else {  
  56.             filterChain.doFilter(request, response);  
  57.         }  
  58.     }  
  59.   
  60.     @Override  
  61.     public void init(FilterConfig arg0) throws ServletException {  
  62.     }  
  63.   
  64. }  

 

 

 

OAServlet.java

 

Java代码  收藏代码
  1. package com.cloud.sso.oa.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class OAServlet extends HttpServlet {  
  11.     private static final long serialVersionUID = 3615122544373006252L;  
  12.   
  13.     @Override  
  14.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  15.         request.getRequestDispatcher("/WEB-INF/jsp/welcome.jsp").forward(request, response);  
  16.     }  
  17.   
  18.     @Override  
  19.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  20.         this.doGet(request, response);  
  21.     }  
  22.   
  23.       
  24. }  

 

 

 

web.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.     <welcome-file-list>  
  4.         <welcome-file>index.jsp</welcome-file>  
  5.     </welcome-file-list>  
  6.   
  7.     <filter>  
  8.         <filter-name>ssoClientFilter</filter-name>  
  9.         <filter-class>com.cloud.sso.oa.filter.SSOClientFilter</filter-class>  
  10.     </filter>  
  11.     <filter-mapping>  
  12.         <filter-name>ssoClientFilter</filter-name>  
  13.         <url-pattern>/*</url-pattern>  
  14.     </filter-mapping>  
  15.   
  16.     <servlet>  
  17.         <servlet-name>list</servlet-name>  
  18.         <servlet-class>com.cloud.sso.oa.servlet.OAServlet</servlet-class>  
  19.     </servlet>  
  20.     <servlet-mapping>  
  21.         <servlet-name>list</servlet-name>  
  22.         <url-pattern>/list</url-pattern>  
  23.     </servlet-mapping>  
  24. </web-app>  

 

 

 

 

 

下面是PRO系统的代码:

 

pom.xml

 

(注意:端口为8083)

 

Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.cloud.sso.pro</groupId>  
  5.   <artifactId>sso-pro</artifactId>  
  6.   <packaging>war</packaging>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <name>sso-pro Maven Webapp</name>  
  9.   <url>http://maven.apache.org</url>  
  10.   <dependencies>  
  11.     <dependency>  
  12.           <groupId>javax.servlet</groupId>  
  13.           <artifactId>servlet-api</artifactId>  
  14.           <version>2.5</version>  
  15.           <scope>provided</scope>  
  16.       </dependency>  
  17.       <dependency>  
  18.           <groupId>commons-httpclient</groupId>  
  19.           <artifactId>commons-httpclient</artifactId>  
  20.           <version>3.1</version>   
  21.       </dependency>  
  22.   </dependencies>  
  23.   <build>  
  24.     <finalName>sso-pro</finalName>  
  25.     <plugins>  
  26.       <plugin>  
  27.           <groupId>org.mortbay.jetty</groupId>  
  28.           <artifactId>jetty-maven-plugin</artifactId>  
  29.           <version>8.1.9.v20130131</version>  
  30.           <configuration>  
  31.               <stopKey>stop</stopKey>  
  32.               <stopPort>6000</stopPort>  
  33.               <webAppConfig>  
  34.                   <contextPath>/pro</contextPath>  
  35.               </webAppConfig>  
  36.               <scanIntervalSeconds>4</scanIntervalSeconds>  
  37.               <connectors>  
  38.                   <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">  
  39.                       <port>8083</port>  
  40.                       <maxIdleTime>60000</maxIdleTime>  
  41.                   </connector>  
  42.               </connectors>  
  43.           </configuration>  
  44.       </plugin>  
  45.     </plugins>  
  46.   </build>  
  47. </project>  

 

 

 

PRO系统中的filter

 

SSOClientFilter.java

 

Java代码  收藏代码
  1. package com.cloud.sso.pro.filter;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URLEncoder;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14. import javax.servlet.http.HttpSession;  
  15.   
  16. import org.apache.commons.httpclient.HttpClient;  
  17. import org.apache.commons.httpclient.methods.PostMethod;  
  18.   
  19. public class SSOClientFilter implements Filter {  
  20.   
  21.     @Override  
  22.     public void destroy() {  
  23.     }  
  24.   
  25.     @Override  
  26.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  27.         HttpServletRequest request = (HttpServletRequest) servletRequest;  
  28.         HttpServletResponse response = (HttpServletResponse) servletResponse;  
  29.         HttpSession session = request.getSession();  
  30.         String username = (String) session.getAttribute("username");  
  31.         String ticket = request.getParameter("ticket");  
  32.         String url = URLEncoder.encode(request.getRequestURL().toString(), "UTF-8");  
  33.   
  34.         if (null == username) {  
  35.             if (null != ticket && !"".equals(ticket)) {  
  36.                 PostMethod postMethod = new PostMethod("http://localhost:8081/sso/ticket");  
  37.                 postMethod.addParameter("ticket", ticket);  
  38.                 HttpClient httpClient = new HttpClient();  
  39.                 try {  
  40.                     httpClient.executeMethod(postMethod);  
  41.                     username = postMethod.getResponseBodyAsString();  
  42.                     postMethod.releaseConnection();  
  43.                 } catch (Exception e) {  
  44.                     e.printStackTrace();  
  45.                 }  
  46.                 if (null != username && !"".equals(username)) {  
  47.                     session.setAttribute("username", username);  
  48.                     filterChain.doFilter(request, response);  
  49.                 } else {  
  50.                     response.sendRedirect("http://localhost:8081/sso/index.jsp?service=" + url);  
  51.                 }  
  52.             } else {  
  53.                 response.sendRedirect("http://localhost:8081/sso/index.jsp?service=" + url);  
  54.             }  
  55.         } else {  
  56.             filterChain.doFilter(request, response);  
  57.         }  
  58.     }  
  59.   
  60.     @Override  
  61.     public void init(FilterConfig arg0) throws ServletException {  
  62.     }  
  63.   
  64. }  

 

 

 

ProServlet.java

 

Java代码  收藏代码
  1. package com.cloud.sso.pro.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class ProServlet extends HttpServlet {  
  11.     private static final long serialVersionUID = -1334093914490423930L;  
  12.   
  13.     @Override  
  14.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  15.         request.getRequestDispatcher("/WEB-INF/jsp/welcome.jsp").forward(request, response);  
  16.     }  
  17.   
  18.     @Override  
  19.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  20.         super.doPost(request, response);  
  21.     }  
  22.   
  23. }  

 

 

 

web.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.     <welcome-file-list>  
  4.         <welcome-file>index.jsp</welcome-file>  
  5.     </welcome-file-list>  
  6.   
  7.     <filter>  
  8.         <filter-name>ssoClientFilter</filter-name>  
  9.         <filter-class>com.cloud.sso.pro.filter.SSOClientFilter</filter-class>  
  10.     </filter>  
  11.     <filter-mapping>  
  12.         <filter-name>ssoClientFilter</filter-name>  
  13.         <url-pattern>/*</url-pattern>  
  14.     </filter-mapping>  
  15.   
  16.     <servlet>  
  17.         <servlet-name>list</servlet-name>  
  18.         <servlet-class>com.cloud.sso.pro.servlet.ProServlet</servlet-class>  
  19.     </servlet>  
  20.     <servlet-mapping>  
  21.         <servlet-name>list</servlet-name>  
  22.         <url-pattern>/list</url-pattern>  
  23.     </servlet-mapping>  
  24. </web-app>  

 

 

 

运行结果:

 

1:分别启动这三个工程。

 

2:访问OA系统,URL:http://localhost:8082/oa/list

 

3:这样到登录页面,如图:

 

 

 

 

4:用户名为:cloud,密码为:cloud,点击登录则会显示,如图:

 



 

 

 

 

5:然后去进入PRO系统,URL:http://localhost:8083/pro/list,则就不需要登录了,直接进入,如图:


 转载至:http://09094224.iteye.com/blog/2024708

 

 

 

  • code.zip (1008.3 KB)
  • 下载次数: 151
分享到:
评论
2 楼 wangwlt 2018-01-26  
1 楼 wangyi_xuxiaowei 2017-07-11  
不错。学习一下。谢谢

相关推荐

    Java 单点登录开发教程(SSO)

    在《SSO单点登录Java开发教程(四)自己动手写SSO单点登录服务端和客户端.md》及《SSO单点登录Java开发教程(五)自己动手写SSO单点注销服务端和客户端.md》中,讲解了如何构建这些组件: 1. **服务端**:主要负责用户...

    sso单点登录实例

    SSO(Single Sign-On)单点登录是一种网络应用的认证技术,它允许用户在一个系统或应用中登录后,无需再次输入凭证即可访问其他关联的系统或应用。这大大提升了用户体验,减少了用户记忆多个密码的负担,同时也有助...

    sso 单点登陆 java 动手写sso

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后,就能访问多个相互关联的应用系统,而无需再次进行身份验证。在Java中实现SSO,我们可以利用Spring Boot框架的强大功能,它提供了丰富的...

    单点登录demo

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统或应用中登录后,无需再次输入凭证即可访问其他相互信任的系统或应用。它简化了用户管理和提升了用户体验,同时减少了密码管理的...

    Java-spring cloud alibaba 微服务单点登录及组件配置学习源码

    本资源“Java-spring cloud alibaba 微服务单点登录及组件配置学习源码”是专为初学者设计的,旨在帮助他们快速理解和实践微服务中的单点登录(SSO)机制,以及如何配置相关组件。 首先,让我们深入了解Spring ...

    单点登录的例子 java写的

    单点登录(Single Sign-On,简称SSO)是一种网络访问控制机制,允许用户在一个系统上进行身份验证后,无需再次登录即可访问其他相互信任的系统。这种机制极大地提高了用户体验,减少了用户记忆多个密码的负担,同时...

    我自己动手写的一个用户管理程序

    在这个自己动手写的用户管理程序中,我们可以看到作者已经包含了完整的说明和源代码,这将为我们理解和学习提供极大的便利。...在实际应用中,还可以进一步扩展,如集成社交登录、实现单点登录(SSO)等高级功能。

    sso完整demo,可直接运行

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。这个压缩包包含了一个完整的SSO示例,可以直接运行,对于理解SSO的工作原理和实现...

    单点登录 oauth21

    单点登录(Single Sign-On, SSO)是一种网络身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。CAS(Central Authentication Service)是实现SSO的一种常用开源框架。OAuth2.0则...

    sso-microservices-oauth2

    标题 "sso-microservices-oauth2" 指向的是一个使用 Java 技术栈构建的单点登录(SSO)系统,该系统应用于微服务架构,并且基于 OAuth2 协议和 Spring Cloud 实现。这个项目可能是为了演示如何在分布式系统中实现...

    cas+shiro+spring实例

    这个实例是专为初学者设计的,旨在帮助他们理解和实现基于CAS的单点登录(Single Sign-On, SSO)系统,同时结合Shiro进行权限管理和认证。下面我们将详细探讨这些技术以及它们如何协同工作。 **CAS (Central ...

    Java_演示示例和游乐场Keycloak扩展提供程序SPI实现等.zip

    Keycloak的核心功能是身份验证和授权,它允许开发者轻松地集成单点登录(SSO)到他们的应用中。SPI是Java设计模式之一,允许外部开发者为系统添加新的功能或行为,而无需修改原始代码。Keycloak通过SPI提供了一个...

    很好的LDAP学习资料

    9. **集成其他系统**:了解如何将LDAP与操作系统(如Windows域服务)、邮件系统、Web应用等集成,实现单点登录(SSO)和身份验证。 **《OpenLDAP管理员指南》**这本书可能涵盖了以上所有主题,并提供深入实践指导。...

    注解、JPA、应用集成

    应用集成可以分为几个层次,如数据集成(例如,通过ETL工具进行数据迁移)、接口集成(如API调用)、服务集成(如微服务间的协作)和UI集成(如单点登录SSO)。常见的集成方式有企业服务总线(ESB)、消息队列(MQ)...

    idp

    4. **身份验证和授权流程**:包括用户登录、令牌的颁发和验证、单点登录(SSO)、单点登出(SLO)等,这些都是 IdP 的核心功能。 5. **数据库集成**:IdP 需要存储用户信息、客户端信息、令牌等数据,因此了解如何...

Global site tag (gtag.js) - Google Analytics