单点登录Cookies+Filter实现

来源:互联网 发布:wampserver如何运行php 编辑:程序博客网 时间:2024/05/20 11:35

使用Cookies+Filter实现www.taobao.tgb.com 和 www.tianmao.tgb.com的单点登录

源码:http://pan.baidu.com/s/1dD1z5lB 密码:8fwk

一 实现原理

使用用户名和密码登录taobao后,会将用户名存储在Session和Cookie中各一份。当用户登录tianmao时,可直接从Cookie中获取用户名和密码,不需要二次登陆。


二 知识点解析

1.本例使用tomcat做服务器,绑定1个域名,且此域名对应2个不同的项目:一个是taobao,另一个是tianmao。

2.访问网址时,不需要输入端口号。


三 步骤:

一)利用MyEclipse创建Web Service Project,名称为:sso_cookie_filter,项目目录结构

二)index.jsp用户登录页

[html] view plaincopy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  3.   
  4. <title>欢迎使用[tianmao]网站</title>  
  5. </head>  
  6. 欢迎使用[tianmao]网站<br><br>  
  7. <body>  
  8.     <c:choose>  
  9.         <c:when test="${not empty sessionScope.user}">  
  10.                 欢迎你:${sessionScope.user}  
  11.         </c:when>  
  12.         <c:otherwise>  
  13.                 你还没有登录,请先登录:  
  14.                  <form action="<%=path%>/login" method="post">  
  15.                 userName:<input type="text" name="userName"><br>  
  16.                 password:<input type="password" name="password"><br>   
  17.                 <input   type="submit" value="登录">  
  18.          </form>  
  19.         </c:otherwise>  
  20.     </c:choose>  
  21. </body>  
  22. </html>  

三)web.xml用于配制:拦截器、Servlet

[html] view plaincopy
  1. <!--  开始:赵栗婧-创建Filter过滤器,用于拦截所有的请求-->  
  2. <filter>  
  3.     <filter-name>autoLogin</filter-name>  
  4.     <filter-class>com.tgb.sso.filter.AutoLoginFilter</filter-class>  
  5. </filter>  
  6. <filter-mapping>  
  7.     <filter-name>autoLogin</filter-name>  
  8.     <url-pattern>/*</url-pattern>  
  9. </filter-mapping>  
  10. <!--  结束:赵栗婧-创建Filter过滤器,用于拦截所有的请求-->  
  11. <!--  开始:赵栗婧-创建Servlet-->  
  12. <servlet>  
  13.     <servlet-name>LoginServlet</servlet-name>  
  14.     <servlet-class>com.tgb.sso.servlet.LoginServlet</servlet-class>  
  15. </servlet>  
  16. <servlet-mapping>  
  17.     <servlet-name>LoginServlet</servlet-name>  
  18.     <url-pattern>/login</url-pattern>  
  19. </servlet-mapping>  
  20. <!--  结束:赵栗婧-创建Servlet-->  

四)编写过滤器:AutoLoginFilter.java

[java] view plaincopy
  1. /** 
  2.  * 自定义过滤器:用户拦截用户登录信息 
  3.  *  
  4.  * @author lizi 
  5.  * @version 1.0.0 2015年7月14日19:29:45 
  6.  */  
  7. public class AutoLoginFilter implements Filter {  
  8.       
  9.   
  10.     // 拦截所有用户请求。  
  11.     // 首先判断session中是否存在用户名。  
  12.     // 若session中不存在用户名,则判断Cookies中是否存在用户名  
  13.     // 若Cookie中存在用户名,则将其放在session中。  
  14.     public void doFilter(ServletRequest req, ServletResponse resp,  
  15.             FilterChain chain) throws IOException, ServletException {  
  16.   
  17.         // 拦截用户请求  
  18.         HttpServletRequest request = (HttpServletRequest) req;  
  19.         // 判断session中,是否为空  
  20.         // 若session中user为空,  
  21.         if (request.getSession().getAttribute("user") == null) {  
  22.             // 获取request中所有的Cookie,并放在数组中  
  23.             Cookie[] cs = request.getCookies();  
  24.             // 若Cookie不为空,则遍历所有的Cookie中所有的记录  
  25.             if (cs != null && cs.length > 0) {  
  26.                 for (Cookie c : cs) {  
  27.                     String cName = c.getName();  
  28.                     // 查找当前用户的Cookie(此处为sso标识)  
  29.                     if (cName.equals("sso")) {  
  30.                         // 获取sso中对应的值,即:用户名userName  
  31.                         String userName = c.getValue();  
  32.                         // 把用户名userName放在session中  
  33.                         request.getSession().setAttribute("user", userName);  
  34.                     }  
  35.                 }  
  36.             }  
  37.         }  
  38.         // 返回当前的请求  
  39.         chain.doFilter(request, resp);  
  40.     }  
  41.   
  42.       
  43.   
  44. }  

五)编写Servlet:LoginServlet.java

[java] view plaincopy
  1. /** 
  2.  * 用户登录Servlet 
  3.  *  
  4.  * @author lizi 
  5.  * @version 1.0.0 2015年7月14日19:29:45 
  6.  */  
  7. public class LoginServlet extends HttpServlet {  
  8.   
  9.     // 若用户提交的是Get请求,则将此请求转发给doPost  
  10.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  11.             throws ServletException, IOException {  
  12.         this.doPost(request, response);  
  13.     }  
  14.   
  15.     // 接受用户的Post请求  
  16.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  17.             throws ServletException, IOException {  
  18.   
  19.         // 获取用户输入的用户名  
  20.         String userName = request.getParameter("userName");  
  21.         // 获取用户输入的面  
  22.         String password = request.getParameter("password");  
  23.         // 若用户名和密码一致,则登录成功(此处实际上,应该查询数据库)  
  24.         if (userName != null && password != null) {  
  25.             if (userName.equals(password)) {  
  26.                 // 把用户名存储在session中  
  27.                 request.getSession().setAttribute("user", userName);  
  28.   
  29.                 // 向客户端写入cookie,名为为sso  
  30.                 Cookie c = new Cookie("sso", userName);  
  31.                 c.setMaxAge(3600);// 设置cookie有效时间为1小时  
  32.                 c.setDomain(".tgb.com");// www.taobao.tgb.com  
  33.                                         // www.tianmao.tgb.com  
  34.                 c.setPath("/");// 拦截所有的请求  
  35.                 response.addCookie(c);// 把cookie添加到response中  
  36.             }  
  37.         }  
  38.         // 跳转到index.jsp页面  
  39.         response.sendRedirect(request.getContextPath() + "/index.jsp");  
  40.     }  
  41.   
  42.       
  43. }  

六)Demo效果

在taobao网站中输入:用户名为taobao ,密码为taobao ,后点击登录。后显示:欢迎界面

此时刷新tianmao网页,可直接显示:欢迎界面(无需登录)


七)查看360浏览器中的Cookie:

      工具-->选项-->高级设置-->内容设置(内容设置...)-->Cookie(所有Cookie和网站数据)

      此处可以查看到:

           为tgb.com保存了一份cookie

           为taobao保存了一份session

           为tianmao保存了一份session

四 拓展知识

以往把项目直接部署在tomcat中,然后通过:localhost:8080/projectname/methodname进行访问。

1.本例使用tomcat做服务器,绑定1个域名,且此域名对应2个不同的项目:一个是taobao,另一个是tianmao。

2.访问网址时,不需要输入端口号。


一)通过域名进行访问(www.taobao.tgb.com 、 www.tianmao.tgb.com),则需要做如下配置:

1.tomcat默认的启动的项目目录是:tomcat\webapps。

此处需要在tomcat安装目录中,新建两个文件夹:taobao、tianmao(如图所示)

后把MyEclipse中的WEB-INF整个文件夹拷贝至taobao和tianmao文件夹中,并更改WEB-INF名称为ROOT

2.修改C:\Windows\System32\drivers\etc\hosts文件,并添加两个节点

3.修改C:\tomcat\apache-tomcat-6.0.35\conf\server.xml文件,并添加两个Host节点

[html] view plaincopy
  1. <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>        
  2. <!--开始:赵栗婧-添加两个Host节点:用于tomcat默认访问的目录-->  
  3. <Host appBase="taobao"  autoDeploy="true" name="www.taobao.tgb.com"  unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>  
  4. <Host appBase="tianmao" autoDeploy="true" name="www.tianmao.tgb.com" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>  
  5. <!--结束:赵栗婧-添加两个Host节点:用于tomcat默认访问的目录-->  


到此为止:

若要访问taobao,则需要浏览器中输入:www.taobao.tgb.com:8080

若需要访问tianmao,则需要浏览器中输入:www.tianmao.tgb.com:8080


二)访问时,去掉端口号8080呢?

修改C:\tomcat\apache-tomcat-6.0.35\conf\server.xml文件,中HTTP的端口号,由8080--->80

原来:

[html] view plaincopy
  1. <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>  

修改后:

[html] view plaincopy
  1. <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>  

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

本例实现效果

        浏览器中输入网址:main.tgb.com,后输入用户名:it_main(以it开头即可)和密码pwd_main(以pwd开头即可),勾选“一周内自动登录”。点击“登录”按钮。即可实现单点登录功能。访问关联的网站,点击news.tgb.com/bbs.tgb.com,则无需输入:用户名和密码。点击“安全退出”按钮,则3个网站同时退出。


实现原理

        首次登录main网址,需要输入用户名和密码。验证通过后,将在Cookie中保存一份用户名和密码(3网址公用的),同时保存有一份Session(只针对于main的session)。当访问关联网站(如:news)时,首先从关联网站中查询各自的session(如news的session)中是否包含用户名和密码,若session为空,则查询cookie中的值,并赋值给关联网站的news的session,此时访问news网址时,无需登录。

        单击“安全退出”,则清空Cookie,同时清空3个网址的session。此时,若仍想登录网站,必须重新输入用户名和密码。


点评

        利用Cookie和Filter实现的单点登录,有其局限性【main.tgb.com   news.tgb.com   bbs.tgb.com 】,只能针对于域名为“.tgb.com”的网址进行共享。

        若要实现不同域名之间的单点登录【如:main.com   news.com   bbs.com】,请参加下一篇文章..........


操作步骤

1.在C:\Windows\System32\drivers\etc中的hosts文件中,添加如下节点(直接添加在文件最后即可):
127.0.0.1  bbs.tgb.com
127.0.0.1  news.tgb.com
127.0.0.1  main.tgb.com

2.在C:\tomcat\apache-tomcat-6.0.35\conf\server.xml中修改HTTP/1.1中的默认端口:由8080改为80,如下所示:
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
3.将main.zip,news.zip,bbs.zip解压后,直接拷贝到apache-tomcat-6.0.35中。
4.启动tomcat,如: C:\tomcat\apache-tomcat-6.0.35\bin中双击startup.bat命令
5.浏览器中输入:main.tgb.com

6.输入用户名:it_main(以it开头即可)和密码pwd_main(以pwd开头即可),勾选“一周内自动登录”。点击“登录”按钮。

7.访问关联的网站,点击news.tgb.com/bbs.tgb.com,则无需输入:用户名和密码。

8.查看浏览器中Cookie和Session中的值

9.点击“安全退出”按钮,则3个网站同时退出。



0 0