单点登录(一)使用Cookie+File实现单点登录

旧城等待, 2022-08-02 07:16 307阅读 0赞

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

源码分享:链接: http://pan.baidu.com/s/1eQheDpS 密码: gn9d

一 实现原理

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

二 知识点解析

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

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

三 步骤:

Center

二)index.jsp用户登录页

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

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

  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

  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. // 首先判断session中是否存在用户名。
  10. // 若session中不存在用户名,则判断Cookies中是否存在用户名
  11. // 若Cookie中存在用户名,则将其放在session中。
  12. public void doFilter(ServletRequest req, ServletResponse resp,
  13. FilterChain chain) throws IOException, ServletException {
  14. // 拦截用户请求
  15. HttpServletRequest request = (HttpServletRequest) req;
  16. // 判断session中,是否为空
  17. // 若session中user为空,
  18. if (request.getSession().getAttribute("user") == null) {
  19. // 获取request中所有的Cookie,并放在数组中
  20. Cookie[] cs = request.getCookies();
  21. // 若Cookie不为空,则遍历所有的Cookie中所有的记录
  22. if (cs != null && cs.length > 0) {
  23. for (Cookie c : cs) {
  24. String cName = c.getName();
  25. // 查找当前用户的Cookie(此处为sso标识)
  26. if (cName.equals("sso")) {
  27. // 获取sso中对应的值,即:用户名userName
  28. String userName = c.getValue();
  29. // 把用户名userName放在session中
  30. request.getSession().setAttribute("user", userName);
  31. }
  32. }
  33. }
  34. }
  35. // 返回当前的请求
  36. chain.doFilter(request, resp);
  37. }
  38. }

五)编写Servlet:LoginServlet.java

  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. // 若用户提交的是Get请求,则将此请求转发给doPost
  9. public void doGet(HttpServletRequest request, HttpServletResponse response)
  10. throws ServletException, IOException {
  11. this.doPost(request, response);
  12. }
  13. // 接受用户的Post请求
  14. public void doPost(HttpServletRequest request, HttpServletResponse response)
  15. throws ServletException, IOException {
  16. // 获取用户输入的用户名
  17. String userName = request.getParameter("userName");
  18. // 获取用户输入的面
  19. String password = request.getParameter("password");
  20. // 若用户名和密码一致,则登录成功(此处实际上,应该查询数据库)
  21. if (userName != null && password != null) {
  22. if (userName.equals(password)) {
  23. // 把用户名存储在session中
  24. request.getSession().setAttribute("user", userName);
  25. // 向客户端写入cookie,名为为sso
  26. Cookie c = new Cookie("sso", userName);
  27. c.setMaxAge(3600);// 设置cookie有效时间为1小时
  28. c.setDomain(".tgb.com");// www.taobao.tgb.com
  29. // www.tianmao.tgb.com
  30. c.setPath("/");// 拦截所有的请求
  31. response.addCookie(c);// 把cookie添加到response中
  32. }
  33. }
  34. // 跳转到index.jsp页面
  35. response.sendRedirect(request.getContextPath() + "/index.jsp");
  36. }
  37. }

六)Demo效果

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

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

SouthEastSouthEast 1SouthEast 2

  1. 工具-->选项-->高级设置-->内容设置(内容设置...)-->Cookie(所有Cookie和网站数据)
  2. 此处可以查看到:
  3. tgb.com保存了一份cookie
  4. taobao保存了一份session
  5. tianmao保存了一份session

Center 1

Center 2

四 拓展知识

以往把项目直接部署在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

SouthEast 3

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

SouthEast 4

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

  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

原来:

  1. <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

修改后:

  1. <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>

参考文章:《tomcat多域名配置》

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 登录

    业务需要,正在研究. 基本有以下三种方案 1.集中管理Session. 实现很简单,但缺点是 每次页面刷新都需要访问一次或两次 Session管理服务器,

    相关 登录

    1:什么事单点登录: SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主

    相关 登录

    一、单系统登录机制 1、http无状态协议   web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务

    相关 登录

    初识单点登录 最初接触到单点登录要追溯到3年多以前了,那时候看到的只是passport,当时要做全国所有社区的登录,然后就照着内部文档写了代码,然后就接入了(这里要提一句

    相关 登录

    以Cookie作为凭证媒介 最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用

    相关 登录

    什么是单点登录? 单点登录(Single Sign On)说的简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其它系统中登录。也就是用户的一次登录能得到其它所有