一、首先我们准备一个简单的web项目,只要可以点击记住密码以后下次自动登录的web项目,我这里用的项目是
MobileSecurity自己以前写好的
①.主要是在登录的时候把用户的用户名和密码存到cookie中,代码如下:
String
cookieValueBase64 =
new
String
(Base64Utils.
encodeBase64
(Base64Utils.
encodeBase64
(userName+
":"
+passWord)));
//
对
cookie
值两次加密,解密也要
2
次
Cookie userCookie=
new
Cookie(Global.
COOKIE_KEY
,cookieValueBase64);
userCookie.setMaxAge(
60
*
60
*
24
*
7
);
//
一周,存活期为一个月
30*24*60*60
userCookie.setPath(
"/"
);
userCookie.setDomain(
" sincerain.com
"
);
response.addCookie(userCookie);
②.然后在过滤器中拦截用户请求,看是否携带cookie,如果携带,则读取cookie,然后执行登录操作(自动登录)
Cookie cookies[] = request1.getCookies();
String cookieValue =
null
;
if
(cookies!=
null
){
for
(
int
i =
0
; i < cookies.
length
; i++){
if
(Global.
COOKIE_KEY
.equals(cookies[i].getName())) {
cookieValue = Base64Utils.
decodeBase64
(Base64Utils .
decodeBase64
(cookies[i].getValue()));
//
对
cookie
解码
String[] value = cookieValue.split(
":"
);
String userName = value[
0
];
String passWord = value[
1
];
JSONObject data =
userService
.userLogin(userName,passWord);
if
(data.get(
"message"
).equals(
100
)) {
request.getSession().setAttribute(Global.
USER_SESSION_KEY
, data.get(
"user"
));
ResponseUtils.
renderJson
(response1, data.toString());
}
chain.doFilter(request, response);
return
;
}
}
}
③.然后就是注销登录这边也要把cookie销毁掉(销毁设置cookie的MaxAge为0就可以了)
Object user = session.getAttribute(Global.
USER_SESSION_KEY
);
session.removeAttribute(Global.
USER_SESSION_KEY
);
//
清除
session
Cookie cookie =
new
Cookie(Global.
COOKIE_KEY
,
null
);
//
清除
cookie
cookie.setMaxAge(
0
);
cookie.setPath(
"/"
);
cookie.setDomain(
" sincerain.com
"
);
response.addCookie(cookie);
☆.重要说明:
在登录方法中设置cookie的
setDomain(
" sincerain.com
"
);属性是为了保证在同域名下,访问其他网站会携带同样的cookie(如果不携带cookie,过滤器就不会执行自动登录就无法做到单点登录了)
☆.
在注销登录方法中设置cookie的
setDomain(
" sincerain.com
"
);属性是为了解决
在同域名下
当其中一个网站用户点击了注销以后,那么其他网站上的cookie也被销毁掉,
如果不在注销方法设置Domain就会导致在其中一个网站上注销以后,在访问第二个网站还是会自动登录
☆.
在登录方法中设置cookie的
setPath
(
"/
"
);属性是为了保证在同域名下,把cookie存放在更目录下,举个例子说明(比如现在网站网址是 http://music.sincerain.com:8080/MobileSecurity/
,当我们登录的时候,他会把cookie存放在 MobileSecurity/
目录下,那么当我们访问 http://music.sincerain.com:8080/MobileSecurity/
index/的时候还是会读取到cookie 如果不设置
setPath
(
"/
"
);那么在你访问网站根目录下的index的时候他是读取不到cookie的
)
二、项目准备好以后,为了方便测试,我们修改电脑的hosts文件,路径在:"C:\Windows\System32\drivers\etc\hosts",添加2行,对应不同的web网站,但是属于同一个 sincerain.com
域名下
127.0.0.1 mail.sincerain.com
127.0.0.1 music.sincerain.com
三、然后我们新解压一个
apache-tomcat-7.0.76,在
apache-tomcat-7.0.76目录
下新建2个文件夹music、mail分别来存放我们的web网站资源
四、然后分别在
music和mail文件夹下新建一个ROOT目录用于存放我们的web网站资源
apache-tomcat-7.0.76\music\ROOT
apache-tomcat-7.0.76\mail\ROOT
五、把我们编译部署好的项目分别copy到music和mail文件夹下:注意是copy所有资源,而不是一个项目(就是复制
MobileSecurity文件夹下面的所有资源,但是不要
MobileSecurity文件夹
)
六、然后配置tomcat的server.xml文件 修改为80端口:如下
connectionTimeout="20000"
redirectPort="8443" />
然后新增一个Host节点,修改host节点中的name等于 music.sincerain.com
,然后在每一个Host节点中新增一个
Context节点用于部署项目,
docBase指向我们的muisc文件夹下面的ROOT。
" appBase="webapps"
unpackWARs="true" autoDeploy="true">
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
修改host节点中的name
等于 mail.sincerain.com
,然后在每一个Host节点中新增一个
Context节点用于部署项目,
docBase指向我们的muisc文件夹下面的ROOT。
" appBase="webapps"
unpackWARs="true" autoDeploy="true">
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
这个时候启动tomcat,会报一个错误
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [C:\Users\HONGLINCHEN\Desktop\apache-tomcat-7.0.76\mail\ROOT\] instead of [C:\Users\HONGLINCHEN\Desktop\apache-tomcat-7.0.76\webapps\MobileSecurity\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
大概意思是说web.xml中的
webAppRootKey重复了,
解决办法是:在每一个项目中的web.xml中新增如下属性
music中
<
context-param
>
<
param-name
>
webAppRootKey
param-name
>
<
param-value
>
MobileSecurity.root
param-value
>
context-param
>
mail中
<
context-param
>
<
param-name
>
webAppRootKey
param-name
>
<
param-value
>
MobileSecurity1.root
param-value
>
context-param
>
重启tomcat问题解决,我们访问 http://mail.sincerain.com/mail/
登录点击记住密码。登录以后进入到主页,我们推出浏览器,直接访问music项目的主页 http://music.sincerain.com/music/loginCenter
发现他也是直接进去了。单点登录没问题
再来测试注销,
我们在 http://music.sincerain.com/music/loginCenter
点击注销,music项目跳转到了登录页面。但是刷新mail的主页,发现并没有跳转到登录页面,这是因为你虽然在music中已经把cookie删除了但是mail人家session还是存在的 人家又没有点击注销,music注销只是清除了他们cookie。那么就是说mail的cookie也被清除了,至少可以证明把浏览器关掉,直接访问 http://mail.sincerain.com/mail/loginCenter
他是不会自动进入首页,而是跳转到登录,经过验证,的确是这样!这样一个简单的单点登录就解决了,下一篇文章介绍不同域下面得单点登录