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

本文使用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多域名配置》

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

时间: 07-13

单点登录(一)使用Cookie+File实现单点登录的相关文章

单点登录(二)使用Cookie+File实现单点登录登出(附源码)

上一篇文章<单点登录(一)使用Cookie+File实现单点登录>中,我们实现了单点登录的功能. 本文作为上一篇文章的扩展部分,添加"单点登出"功能. 源码下载:链接: http://pan.baidu.com/s/1bn57xCF 密码: 5apa 本例实现效果 浏览器中输入网址:main.tgb.com,后输入用户名:it_main(以it开头即可)和密码pwd_main(以pwd开头即可),勾选"一周内自动登录".点击"登录"按

PHP不同域名cookie共享(单点登录实现原理)

PHP使用P3P完成COOKIE跨域操作实际实用中,类似的需求有,比如说我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是单点登录(SSO)功能.为了测试的方便,先编辑hosts文件,加入测试域名 sudo vim /etc/hosts 192.168.1.112 www.a.com 192.168.1.112 www.b.com 代码实现 www.a.com域名下的代码文件:[a_setcookie.php]<?php      //header('P3P: CP=

基于cookie的SSO单点登录系统 - waen - 博客园

原文:基于cookie的SSO单点登录系统 - waen - 博客园 利用数据库触发器实现定期自动增量更新缓存 原文地址:https://www.cnblogs.com/lonelyxmas/p/10434813.html

cookie+memcached实现单点登陆

10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆.不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路.先来看看什么叫单点登陆 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制. --百度百科 为什么要实

从其它系统登录到SharePoint 2010系统的单点登录

从其它系统登录到SharePoint 2010系统的单点登录 分类: sharepoint2010 2014-03-18 16:28 68人阅读 评论(0) 收藏 举报 转:http://www.tuicool.com/articles/i22Ibu 以前做的只是使用SharePoint的单一登录,用SharePoint去登录其他的系统,现在要反过来,用Form认证的系统来登录SharePoint. 我们都知道,SharePoint使用的是域认证系统,登录到SharePoint系统上,用户必须要

用Okhttp框架登录之后的Cookie设置到webView中(转)

用Okhttp框架登录之后的Cookie设置到webView中(正文) 1.webview中设置: [java] view plain copy @SuppressWarnings("deprecation") public void synCookies(Context context, String url) { CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManage

[原创]java WEB学习笔记29:Cookie Demo 之自动登录

1. 自动登录 的需求 ① 不需要填写用户名和密码等信息,可以自动登录到系统 ②  login.jsp  hello.jsp login.jsp 1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01

自己Cookie写的自动登录功能

sql表 username  password字段 User类 有 id username password等字段 Service有一函数 1 @Override 2 3 public User findUser(String username) 4 { 5 return userDao.findUser(username); 6 } 实现 1 @Override 2 public User findUser(String username) { 3 try { 4 return qr.quer

如何利用cookie来保存用户登录账号

众所周知,cookie在网页编写中不接或缺,今天就谈谈如何利用cookie技术来保存用户登录账号 1.首先是否保存用户登录账号当然是用户自行决定,所以我们需要在用户登录界面设置一个复选框,以此取得用户意愿信息,以便为下一步操作提供判断依据. require_once 'common.php'; 用户账号:</td><td><input type="text" name="id" value="<?php echo get