一、使用Cookie解決單點登陸
技術點:html
一、設置Cookie的路徑爲setPath("/").即Tomcat的目錄下都有效java
二、設置Cookie的域setDomain(".itcast.com");即bbs.itcast.com,或是mail.itcast.com有效。即跨域。web
三、設置Cookie的時間。即便用戶不選擇在幾天內自動登陸,也應該保存Cookie以保存在當前瀏覽器沒有關閉的狀況下有效。跨域
四、使用Filter自動登陸。瀏覽器
實現步驟tomcat
1:首先要準備出幾個虛擬主機並配置hosts文件,即本機DNS修改本機的C:\Windows\System32\drivers\etc下的hosts文件。安全
- <span style="font-size:18px;"><span style="font-size:18px;"># 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
- </span></span>
增長几個Host節點,經過Cookie實現自動登陸,必須配置的虛擬主頁知足xxx.itcast.cn,即主域名必須保持一致。服務器
通常web應用中通常部署在web.xml文件中,單點退出相關配置以下:
cookie
說明:咱們看到單點退出的相關類結構,web.xml配置了單點退出的相關類(1個監聽器SingleSignOutHttpSessionListener,2個過濾器SingleSignOutFilter,SimpleServerLogoutHandler)。session
實現利用了session存儲機制,SessionStoreManager是個單例類,用於管理session的存儲、刪除;SessionMappingStorage是session的存儲、刪除的執行者,能夠看到實際存儲的結構是一個artifactId、sessionId爲名值對的HashMap表;監聽器SingleSignOutHttpSessionListener的做用是session銷燬時,調用session管理單例類SessionStoreManager進行session的刪除銷燬;
SingleSignOutFilter的做用有2個:一個是在單點訪問攔截安全資源時調用單例類SessionStoreManager存儲session,另外一個是在單點退出時調用單例類SessionStoreManager刪除session;SimpleServerLogoutHandler的做用是將客戶端的退出請求轉發到SSO服務器端,集中處理作各個子系統的單點退出。
二、先在bbs(或是mail)虛擬目錄下,開發一個能夠自動登陸的程序,使用Filter:
- <span style="font-size:18px;"><span style="font-size:18px;">一、登陸的主頁以下:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <html>
- <head>
- </head>
- <body>
- <p>在同一臺服務器上,多個站點自動登陸....>>:<%=session.getId()%></p>
- <c:if test="${empty sessionScope.user}">
- <form name="f" method="post" action="<c:url value='/login'/>">
- Name:<input type="text" name="name"/><br/>
- Pwd:<input type="text" name="pwd"/><br/>
- <input type="checkbox" name="chk" value="7">一週內自動登陸<br/>
- <input type="submit" value="登陸"/>
- </form>
- </c:if>
- <c:if test="${not empty sessionScope.user}">
- 歡迎你:${user}。<a href="<c:url value='/loginout'/>">安全退出</a>
- </c:if>
- <br/>
- 相關站點:(只要在一邊登陸成功,便可以自動登陸到另外一個程序)<br/>
- <a href="http://mail.itcast.com:7777">mail.itcast.com</a><br/>
- <a href="http://bbs.itcast.com:7777">bbs.itcast.com</a><br/>
- </body>
- </html>
- </span></span>
二、登陸的Servlet程序以下:
- <span style="font-size:18px;"><span style="font-size:18px;">/**
- * 用戶登陸
- */
- 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().equals("") &&
- pwd.startsWith("pwd")){
- System.err.println("登陸成功。。。。。");
- forward = "/jsps/welcome.jsp";
- //不管如何,都要設置cookie,若是沒有選擇自動登陸,則只在當前頁面的跳轉時有效,不然設置有效期間爲7天。
- Cookie cookie = new Cookie("autologin",nm+"@"+pwd);
- cookie.setPath("/"); //若是路徑爲/則爲整個tomcat目錄有用
- cookie.setDomain(".itcast.com"); //設置對全部*.itcast.com爲後綴的域名效
- if(chk!=null){
- int time = 1*60*60*24*7; //1秒*60=1分*60分=1小時*24=1天*7=7天
- cookie.setMaxAge(time);
- }
- resp.addCookie(cookie);
- req.getSession().setAttribute("user", nm);
- }else{
- System.err.println("登陸不成功。。。。。。");
- }
- req.getRequestDispatcher(forward).forward(req, resp);
- }
- }
-
- </span></span>
三、自動登陸的Filter程序以下:
- <span style="font-size:18px;"><span style="font-size:18px;">/**
- * 自動登陸
- */
- public class AutoLogin implements Filter {
- public void destroy() {}
- public void doFilter(ServletRequest req, ServletResponse resp,
- FilterChain chain) throws IOException, ServletException {
- System.err.println("開始自動登陸驗證.....");//此類中應該對登陸的servlet直接放行。根據判斷url決定。
- HttpServletRequest requ = (HttpServletRequest) req;
- HttpSession s = requ.getSession();
- if (s.getAttribute("user") != null) {//若是用戶已經登陸則直接放行
- System.err.println("用戶已經登陸,沒有必需要再作自動登陸。。。。");
- } else {
- Cookie[] cookies = requ.getCookies();
- if (cookies != null) {
- for (Cookie ck : cookies) {
- if (ck.getName().equals("autologin")) {// 是不是自動登陸。。。。
- System.err.println("自動登陸成功。。。。。");
- String val = ck.getValue();
- String[] vals = val.split("@");
- s.setAttribute("user", vals[0]);
- }
- }
- }
- }
- chain.doFilter(req, resp);
- }
- public void init(FilterConfig filterConfig) throws ServletException {}
- }
- </span></span>
四、正常退出的Servlet以下
- <span style="font-size:18px;"><span style="font-size:18px;">/**
- * 安全退出刪除Cookie
- */
- public class LoginOutServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- HttpSession s = req.getSession(); //獲取Session
- Cookie cookie = new Cookie("autologin","");//必須聲明一個徹底相同名稱的Cookie
- cookie.setPath("/");//路徑也要徹底相同
- cookie.setDomain(".itcast.com");//域也要徹底相同
- cookie.setMaxAge(0);//設置時間爲0,以直接刪除Cookie
- resp.addCookie(cookie);
- s.removeAttribute("user");
- System.err.println("安全退出。。。。。");
- resp.sendRedirect(req.getContextPath()+"/index.jsp");
- }
- }
- </span></span>
這種是基於最簡單的方式實現的單點登陸