sso

@font-face { font-family: "Arial"; }@font-face { font-family: "Courier New"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "黑体"; }@font-face { font-family: "@黑体"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 10.5pt; font-family: "Times New Roman"; }h1 { margin: 17pt 0cm 16.5pt; text-align: justify; line-height: 240%; page-break-after: avoid; font-size: 22pt; font-family: "Times New Roman"; }h2 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: Arial; }h3 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: "Times New Roman"; }.MsoChpDefault { font-size: 10pt; }div.WordSection1 { page: WordSection1; }

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。

       配置虚拟主机,主要通过修改tomcat_home/conf/server.xml文件完成:

 

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

 

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"%>

<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>

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().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);

    }

}

 

3、自动登录的Filter程序如下:

/**

 * 自动登录

 */

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 {}

}

4、正常退出的Servlet如下

/**

 * 安全退出删除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");

    }

}

 

5、关于自动登录的一些思考

为了让单点登录,变成可配置的功能,可以将保存Cookie的代码,放到自动登录的Filter中实现。

如果配置自动登录的Filter则同时实现闪单点登录,否则不加实现。

你可能感兴趣的:(sso)