最近在工作中,牛逼的前端为追求更好的体验,如对于无需与后台请求交互(纯前端的页面跳转、页面内容的展示),但Session已过期,用户操作后提交,后台再提示已过期,给用户的体验不好,于是想到了Cookie,具体如下:
1.后台过依然在过滤器中以Session来进行是否过期的判断
2.在过滤器中增加设置Cookie的逻辑,过期时间同Session,即从Sesion中获取用户信息,如果不为空,说明没过期,然后设置Cookie(name为用户ID)
3.前端从Cookie中获取用户ID,如能获取到,说明未过期,即无需做跳转,否则跳转到登录页面
JAVA:
String userId = (String) request.getSession().getAttribute(Constants.SESSION_KEY_USER_ID);
if (userId != null) {
//cookie 同属性(name、value、path)对象,重复添加会覆盖
Cookie cookie = new Cookie(Constants.COOKIE_KEY_USER_ID, userId);
cookie.setMaxAge(Constants.SESSION_TIME_OUT);
cookie.setPath(request.getContextPath() + "/");
response.addCookie(cookie);
}
前端:
var userId = $.cookie('userId'); if(!userId){ window.location.href='login.html?'+new Date().getTime(); }
附:
一.Cookies入门
Cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段。IE浏览器把Cookie信息保存在类似于C://windows//cookies的目录下。
当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。
cookies给网站和用户带来的好处非常多:
1.Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
2.Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
3.Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
4.Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
二.cookie过期时间设置方式
cookie.setMaxAge(0);//不记录cookie
cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效
cookie.setMaxAge(60*60);//过期时间为1小时
三.JS设置Cookie
1.jQuery方法(当然,前提是要引入jquery.cookie.js):
var date = new Date(); var loginCount = 0; date.setTime(date.getTime()+10*1000);//只能这么写,10表示10秒钟 $.cookie('loginCount', ++loginCount, {expires: date});
2.js方法:
document.cookie='loginCount=1;expires='+new Date()+';path=/';
3.检查cookies是否可用
方法一:
jquery的$.cookie("cookie名称");判断是否为空就可以
方法二:
$(document).ready(function() {var dt = new date();dt.setseconds(dt.getseconds() + 60);document.cookie = "cookietest=1; expires=" + dt.togmtstring();var cookiesenabled = document.cookie.indexof("cookietest=") != -1;if(!cookiesenabled){//cookies不能用……..}});
四.Cookie中的path与domain属性详解
1.domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
2.path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。
3.浏览器会将domain和path都相同的cookie保存在一个文件里,cookie间用*隔开。
4.含值键值对的cookie:以前一直用的是name=value单键值对的cookie,含多个子键值对的cookie格式是name=key1=value1&key2=value2。可以理解为单键值对的值保存一个自定义的多键值字符串,其中的键值对分割符为&,当然可以自定义一个分隔符,但用asp.net获取时是以&为分割符。