• 单点登录(一)使用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多域名配置》

  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6814278.html
Copyright © 2020-2023  润新知