单点登录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用户登录页
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
-
- <title>欢迎使用[tianmao]网站</title>
- </head>
- 欢迎使用[tianmao]网站<br><br>
- <body>
- <c:choose>
- <c:when test="${not empty sessionScope.user}">
- 欢迎你:${sessionScope.user}
- </c:when>
- <c:otherwise>
- 你还没有登录,请先登录:
- <form action="<%=path%>/login" method="post">
- userName:<input type="text" name="userName"><br>
- password:<input type="password" name="password"><br>
- <input type="submit" value="登录">
- </form>
- </c:otherwise>
- </c:choose>
- </body>
- </html>
三)web.xml用于配制:拦截器、Servlet
-
- <filter>
- <filter-name>autoLogin</filter-name>
- <filter-class>com.tgb.sso.filter.AutoLoginFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>autoLogin</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
-
- <servlet>
- <servlet-name>LoginServlet</servlet-name>
- <servlet-class>com.tgb.sso.servlet.LoginServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>LoginServlet</servlet-name>
- <url-pattern>/login</url-pattern>
- </servlet-mapping>
-
四)编写过滤器:AutoLoginFilter.java
-
-
-
-
-
-
- public class AutoLoginFilter implements Filter {
-
-
-
-
-
-
- public void doFilter(ServletRequest req, ServletResponse resp,
- FilterChain chain) throws IOException, ServletException {
-
-
- HttpServletRequest request = (HttpServletRequest) req;
-
-
- if (request.getSession().getAttribute("user") == null) {
-
- Cookie[] cs = request.getCookies();
-
- if (cs != null && cs.length > 0) {
- for (Cookie c : cs) {
- String cName = c.getName();
-
- if (cName.equals("sso")) {
-
- String userName = c.getValue();
-
- request.getSession().setAttribute("user", userName);
- }
- }
- }
- }
-
- chain.doFilter(request, resp);
- }
-
-
-
- }
五)编写Servlet:LoginServlet.java
-
-
-
-
-
-
- public class LoginServlet extends HttpServlet {
-
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doPost(request, response);
- }
-
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
-
- String userName = request.getParameter("userName");
-
- String password = request.getParameter("password");
-
- if (userName != null && password != null) {
- if (userName.equals(password)) {
-
- request.getSession().setAttribute("user", userName);
-
-
- Cookie c = new Cookie("sso", userName);
- c.setMaxAge(3600);
- c.setDomain(".tgb.com");
-
- c.setPath("/");
- response.addCookie(c);
- }
- }
-
- response.sendRedirect(request.getContextPath() + "/index.jsp");
- }
-
-
- }
六)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节点
- <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>
-
- <Host appBase="taobao" autoDeploy="true" name="www.taobao.tgb.com" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>
- <Host appBase="tianmao" autoDeploy="true" name="www.tianmao.tgb.com" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>
-
到此为止:
若要访问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
原来:
- <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
修改后:
- <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