接上文,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()%>
相关站点:(只要在一边登录成功,即可以自动登录到另一个程序)
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()