单点登录(一)使用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网页,可直接显示:欢迎界面(无需登录)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
七)查看360浏览器中的Cookie:
工具-->选项-->高级设置-->内容设置(内容设置...)-->Cookie(全部Cookie和站点数据)
此处能够查看到:
为tgb.com保存了一份cookie
为taobao保存了一份session
为tianmao保存了一份session
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
四 拓展知识
以往把项目直接部署在tomcat中,然后通过:localhost:8080/projectname/methodname进行訪问。
1.本例使用tomcat做server,绑定1个域名,且此域名相应2个不同的项目:一个是taobao,还有一个是tianmao。
2.訪问网址时,不须要输入port号。
一)通过域名进行訪问(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文件,并加入两个节点
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
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
二)訪问时,去掉port号8080呢?
改动C:\tomcat\apache-tomcat-6.0.35\conf\server.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多域名配置》
单点登录(一)使用Cookie+File实现单点登录的更多相关文章
- 单点登录(二)使用Cookie+File实现单点登录登出(附源代码)
上一篇文章<单点登录(一)使用Cookie+File实现单点登录>中,我们实现了单点登录的功能. 本文作为上一篇文章的扩展部分,加入"单点登出"功能. 源代码下载:链接 ...
- requests库使用:通过cookie跳过验证码登录,并用Session跨请求保持cookie
拿我平时测试的一个系统为例,从UI层面来说必须先登录才可以进行后续操作,但是我在测试接口文档提供的接口时,发现并不需要登录,每个接口只要传参就可以正常返回.原因是我们这边专门弄了一个接口包来统一管理常 ...
- PHP不同域名cookie共享(单点登录实现原理)
PHP使用P3P完成COOKIE跨域操作实际实用中,类似的需求有,比如说我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是单点登录(SSO)功能.为了测试的方便,先编辑ho ...
- SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jquery ajax跨 ...
- php单点登录之模拟淘宝天猫同步登录
说到单点登录大家都很了解,一个站点登录其他域会自动登录. 单点登录SSO(Single Sign On)的方法有很多,比如:p3p.共享session.共享cookice.第三方OAuth认证. 这里 ...
- cookie+memcached实现单点登陆
10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆.不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路.先来看 ...
- 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密
我们在前一篇文章中实现了cas4.2.x登录使用mongodb验证方式. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程 也学习参考了cas5.0.x版 ...
- Memcache+Cookie解决分布式系统共享登录状态
Memcached高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.Memcached能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. Memc ...
- .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息
在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...
随机推荐
- 无阻赛的脚本(js脚本延迟方法)
js脚本的加载与执行 1.延迟脚本(defer属性) 带有defer属性的script标签,可以放置在文档的任何位置,在页面解析到该标签时,会开始下载该脚本,但是不会立即执行,直到dom加载完成(on ...
- Python爬虫入门:爬虫基础了解
有粉丝私信我想让我出更基础一些的,我就把之前平台的copy下来了,可以粗略看一下,之后都会慢慢出. 1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫 ...
- django之第二天
今天学习目标: 一,路由系统 1,默认处理函数 2,动态URL 3,分级匹配 4,反射实现动态路由 二.中间件 三.Model(重点) 1,创建表 2,操作表数据 四.Form (重点) 1,用户提交 ...
- java并发之线程执行器(Executor)
线程执行器和不使用线程执行器的对比(优缺点) 1.线程执行器分离了任务的创建和执行,通过使用执行器,只需要实现Runnable接口的对象,然后把这些对象发送给执行器即可. 2.使用线程池来提高程序的性 ...
- 【Android开发学习笔记之一】5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- 《java.util.concurrent 包源码阅读》12 线程池系列之ThreadPoolExecutor 第二部分
接着说worker线程是如何工作的.ThreadPoolExecutor有一个成员类叫Worker,所起到的作用就是线程池worker线程的作用. private final class Worker ...
- 《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分
这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int ...
- TFboy养成记 tensor shape到底怎么说
tensor.shape 对于一位向量,其形式为[x,] 对于矩阵,二维矩阵[x,y],三维矩阵[x,y,z] 对于标量,也就是0.3*x这种0.3,表示形式为() 如果说这个矩阵是三维的,你想获得其 ...
- JDK8新特性一览
转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...
- Function Programming - 纯函数(Pure Function)
纯函数的定义,非常重要!! Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用. 老样子,我们还是从最简单的栗子开始: var minimum = 21; va ...