SSO 基于Cookie+fliter实现单点登录 实例解析(一)(一)

2015-01-27 14:08:02 · 作者: · 浏览: 72

接上文,SSO的理论讲解,接下来实践实践!

?

1、使用Cookie解决单点登录

技术点:

1、设置Cookie的路径为setPath(/).即Tomcat的目录下都有效

2、设置Cookie的域setDomain(.itcast.com);即bbs.itcast.com,或是mail.itcast.com有效。即跨域。

3、设置Cookie的时间。即使用户不选择在几天内自动登录,也应该保存Cookie以保存在当前浏览器没有关闭的情况下有效。

4、使用Filter自动登录。

?

实现步骤

1:首先要准备出几个虚拟主机并配置hosts文件,即本机DNS修改本机的C:WindowsSystem32driversetc下的hosts文件。

?

# localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost 127.0.0.1 localhost 127.0.0.1 www.bbs.itcast.cn 127.0.0.1 www.news.itcast.cn 127.0.0.1 www.news.com 127.0.0.1 www.bbs.com 127.0.0.1 www.server.com 

增加几个Host节点,通过Cookie实现自动登录,必须配置的虚拟主页满足xxx.itcast.cn,即主域名必须保持一致。

?

一般web应用中一般部署在web.xml文件中,单点退出相关配置如下:


     
     
      CAS Authentication Filter
      
     
      org.jasig.cas.client.authentication.AuthenticationFilter
      
      
       
      
       casServerLoginUrl
       
      
       http://www.server.com:8080/login
       
      
      
       
      
       serverName
       
      
       http://www.bbs.com:8080
       
      
      
      
       renew
       
      
       false
       
      
      
      
       gateway
       
      
       false
       
      
     
     
     
      CAS Validation Filter
      
     
      org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
      
      
      
       casServerUrlPrefix
       
      
       http://www.server.com:8080
       
      
      
      
       serverName
       
      
       http://www.bbs.com:8080
       
      
      
     
     
     
      CAS HttpServletRequest Wrapper Filter
      
     
      org.jasig.cas.client.util.HttpServletRequestWrapperFilter
      
     
     
     
      CAS Assertion Thread Local Filter
      
     
      org.jasig.cas.client.util.AssertionThreadLocalFilter
      
     
     
     
     
     
     
      CAS Authentication Filter
      
     
      /protected/*
      
     
     
     
      CAS Validation Filter
      
     
      /*
      
     
     
     
      CAS HttpServletRequest Wrapper Filter
      
     
      /*
      
     
     
     
      CAS Assertion Thread Local Filter
      
     
      /*
      
     
     
     
      CAS Validation Filter
      
     
      /proxyCallback
      
     
     
     
     
     
     
     
      index.jsp
      
    

说明:我们看到单点退出的相关类结构,web.xml配置了单点退出的相关类(1个监听器SingleSignOutHttpSessionListener,2个过滤器SingleSignOutFilter,SimpleServerLogoutHandler)。

?

实现利用了session存储机制,SessionStoreManager是个单例类,用于管理session的存储、删除;SessionMappingStorage是session的存储、删除的执行者,可以看到实际存储的结构是一个artifactId、sessionId为名值对的HashMap表;监听器SingleSignOutHttpSessionListener的作用是session销毁时,调用session管理单例类SessionStoreManager进行session的删除销毁;

SingleSignOutFilter的作用有2个:一个是在单点访问拦截安全资源时调用单例类SessionStoreManager存储session,另一个是在单点退出时调用单例类SessionStoreManager删除session;SimpleServerLogoutHandler的作用是将客户端的退出请求转发到SSO服务器端,集中处理做各个子系统的单点退出。

?

2、先在bbs(或是mail)虚拟目录下,开发一个可以自动登录的程序,使用Filter:

1、登录的主页如下: <%@ page language=java import=java.util.* pageEncoding=UTF-8%> <%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%> 

在同一台服务器上,多个站点自动登录....>>:<%=session.getId()%>

> Name:
Pwd:
一周内自动登录
?
欢迎你:${user}。 >安全退出
相关站点:(只要在一边登录成功,即可以自动登录到另一个程序)
mail.itcast.com
bbs.itcast.com


2、登录的Servlet程序如下:

/** * 用户登录 */ public class LoginServlet extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String nm = req.getParameter(name); String pwd = req.getParameter(pwd); String chk = req.getParameter(chk); //是否选中了7天自动登录 String forward = /index.jsp; if(nm!=null && !nm.trim().equals() && nm.startsWith(it)//用户名是it开始,且密码是pwd开始的可以登录 && pwd !=null && !pwd.trim()