zoukankan      html  css  js  c++  java
  • 单点登录(一)使用Cookie+File实现单点登录

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

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


    一 实现原理

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


    二 知识点解析

    1.本例使用tomcat做server。绑定1个域名。且此域名相应2个不同的项目:一个是taobao,还有一个是tianmao。

    2.訪问网址时,不须要输入port号。


    三 步骤:

    一)利用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>
    		<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>
    	<!--  结束:赵栗婧-创建Filter过滤器。用于拦截全部的请求-->
    	<!--  開始:赵栗婧-创建Servlet-->
    	<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>
    	<!--  结束:赵栗婧-创建Servlet-->
    	

    四)编写过滤器:AutoLoginFilter.java

    /**
     * 自己定义过滤器:用户拦截用户登录信息
     * 
     * @author lizi
     * @version 1.0.0 2015年7月14日19:29:45
     */
    public class AutoLoginFilter implements Filter {
    	
    
    	// 拦截全部用户请求。

    // 首先推断session中是否存在username。

    // 若session中不存在username,则推断Cookies中是否存在username // 若Cookie中存在username,则将其放在session中。 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // 拦截用户请求 HttpServletRequest request = (HttpServletRequest) req; // 推断session中,是否为空 // 若session中user为空, if (request.getSession().getAttribute("user") == null) { // 获取request中全部的Cookie。并放在数组中 Cookie[] cs = request.getCookies(); // 若Cookie不为空,则遍历全部的Cookie中全部的记录 if (cs != null && cs.length > 0) { for (Cookie c : cs) { String cName = c.getName(); // 查找当前用户的Cookie(此处为sso标识) if (cName.equals("sso")) { // 获取sso中相应的值,即:usernameuserName String userName = c.getValue(); // 把usernameuserName放在session中 request.getSession().setAttribute("user", userName); } } } } // 返回当前的请求 chain.doFilter(request, resp); } }


    五)编写Servlet:LoginServlet.java

    /**
     * 用户登录Servlet
     * 
     * @author lizi
     * @version 1.0.0 2015年7月14日19:29:45
     */
    public class LoginServlet extends HttpServlet {
    
    	// 若用户提交的是Get请求,则将此请求转发给doPost
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doPost(request, response);
    	}
    
    	// 接受用户的Post请求
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		// 获取用户输入的username
    		String userName = request.getParameter("userName");
    		// 获取用户输入的面
    		String password = request.getParameter("password");
    		// 若username与password一致。则登录成功(此处实际上,应该查询数据库)
    		if (userName != null && password != null) {
    			if (userName.equals(password)) {
    				// 把username存储在session中
    				request.getSession().setAttribute("user", userName);
    
    				// 向client写入cookie,名为为sso
    				Cookie c = new Cookie("sso", userName);
    				c.setMaxAge(3600);// 设置cookie有效时间为1小时
    				c.setDomain(".tgb.com");// www.taobao.tgb.com
    										// www.tianmao.tgb.com
    				c.setPath("/");// 拦截全部的请求
    				response.addCookie(c);// 把cookie加入到response中
    			}
    		}
    		// 跳转到index.jsp页面
    		response.sendRedirect(request.getContextPath() + "/index.jsp");
    	}
    
    	
    }
    

    六)Demo效果

    在taobao站点中输入:username为taobao 。password为taobao ,后点击登录。后显示:欢迎界面

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


    七)查看360浏览器中的Cookie

          工具-->选项-->高级设置-->内容设置(内容设置...)-->Cookie(全部Cookie和站点数据)

          此处能够查看到:

               为tgb.com保存了一份cookie

               为taobao保存了一份session

               为tianmao保存了一份session

    四 拓展知识

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

    1.本例使用tomcat做server,绑定1个域名,且此域名相应2个不同的项目:一个是taobao,还有一个是tianmao。

    2.訪问网址时,不须要输入port号。


    一)通过域名进行訪问(www.taobao.tgb.com 、 www.tianmao.tgb.com)。则须要做例如以下配置:

    1.tomcat默认的启动的项目文件夹是:tomcatwebapps。

    此处须要在tomcat安装文件夹中,新建两个文件夹:taobao、tianmao(如图所看到的)

    后把MyEclipse中的WEB-INF整个目录拷贝至taobao和tianmao目录中。并更改WEB-INF名称为ROOT

    2.改动C:WindowsSystem32driversetchosts文件,并加入两个节点

    3.改动C: omcatapache-tomcat-6.0.35confserver.xml文件,并加入两个Host节点

          <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>	  
          <!--開始:赵栗婧-加入两个Host节点:用于tomcat默认訪问的文件夹-->
          <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>
          <!--结束:赵栗婧-加入两个Host节点:用于tomcat默认訪问的文件夹-->


    到此为止:

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

    若须要訪问tianmao。则须要浏览器中输入:www.tianmao.tgb.com:8080


    二)訪问时,去掉port号8080呢?

    改动C: omcatapache-tomcat-6.0.35confserver.xml文件。中HTTP的port号。由8080--->80

    原来:

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

    改动后:

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



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

  • 相关阅读:
    深入了解 JavaScript 中的 for 循环
    JavaScript 字符串常用操作
    10个习惯助你成为一名优秀的程序员
    Ubuntu日常问题搜集和解决办法
    提升你的开发效率,10 个 NPM 使用技巧
    Redux教程3:添加倒计时
    Redux教程2:链接React
    Redux教程1:环境搭建,初写Redux
    React + Redux 入坑指南
    12个非常实用的JavaScript小技巧
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6814278.html
Copyright © 2011-2022 走看看