码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-15 00:01:32      阅读:459      评论:0      收藏: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.访问网址时,不需要输入端口号。


三 步骤:

一)利用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中是否存在用户名。
	// 若session中不存在用户名,则判断Cookies中是否存在用户名
	// 若Cookie中存在用户名,则将其放在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中对应的值,即:用户名userName
						String userName = c.getValue();
						// 把用户名userName放在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 {

		// 获取用户输入的用户名
		String userName = request.getParameter("userName");
		// 获取用户输入的面
		String password = request.getParameter("password");
		// 若用户名和密码一致,则登录成功(此处实际上,应该查询数据库)
		if (userName != null && password != null) {
			if (userName.equals(password)) {
				// 把用户名存储在session中
				request.getSession().setAttribute("user", userName);

				// 向客户端写入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网站中输入:用户名为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节点:用于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


二)访问时,去掉端口号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"/>



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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/zhaolijing2012/article/details/46882297

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!