Cookie的应用
什么是cookie
Cookie
是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是各自用户自己的数据了
特点是会话数据保存在浏览器客户端
cookie常用api实例
//1.创建Cookie对象
Cookie cookie = new Cookie("name","eric");
//2.设置Cookie参数
//2.1.设置Cookie的有效路径
cookie.setPath("/hello");//默认就是web项目的地址
//2.2.设置Cookie的有效时间
cookie.setMaxAge(20);//该cookie只存活20秒,从最后不调该cookie开始计算
cookie.setMaxAge(-1);//该cookie保存在浏览器内存中,关闭浏览器则销毁该cookie
cookie.setMaxAge(0);//删除根该cookie同名的cookie
//3.把数据发送到浏览器
response.addCookie(cookie);
//4.服务端接收来自浏览器的cookie
//方法1:
// String name = request.getHeader("cookie");
// System.out.println(name);
//方法2:
Cookie[] cookies = request.getCookies();
//注意:判断null,否则空指针
if(cookies!=null){
//遍历
for(Cookie c:cookies){
String name = c.getName();
String value = c.getValue();
System.out.println(name+"="+value);
}
}else{
System.out.println("没有接收cookie数据");
}
上面代码原理
服务端创建 Cookie对象,将会话的数据存储在Cookie对象中,通过
response.addCookie(cookie);
其实是隐藏发送了一个set-cookie名称的响应头
发送到客户端。
下次客户端只要查询本地的cookie是否有对应的值,即可。
利用cookie显示上次登录时间
案例效果图说明:当用户首次访问时,服务端
创建cookie,设置有效期一个月,并将时间存储进去,发送cookie到客户端进行存储。当客户端下次访问时,查询cookie是否有值,有则显示时间。
jsp界面
<h3>这里是首页</h3>
<p id="login_msg"></p>
<script type="text/javascript">
$.ajax(
{
type:"get",
url:"CookiesServlet?type=gettime",
dataType:"text",
success:function(data)
{
$("#login_msg").text(data);
}
}
);
</script>
servlet
protected void getTime(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
//获取当前时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
String curTime = format.format(new Date());
//取得cookie
Cookie[] cookies = request.getCookies();
String lastTime = null;
//第n次访问
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("lastTime")){
//有lastTime的cookie,已经是第n次访问
lastTime = cookie.getValue();//上次访问的时间
//第n次访问
//1.把上次显示时间显示到浏览器
response.getWriter().print("欢迎回来,你上次访问的时间为:"+lastTime+",当前时间为:"+curTime);
//2.更新cookie
cookie.setValue(curTime);
//正整数:表示Cookie数据保存浏览器的缓存到硬盘中,数值表示保存的时间
//负整数:表示Cookie数据保存到浏览器的内存中,浏览器关闭Cookie就丢失了
// 零:表示删除同名的Cookie数据
cookie.setMaxAge(1*30*24*60*60);
//3.把更新后的cookie发送到浏览器
response.addCookie(cookie);
break;
}
}
}
/**
* 第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie)
*/
if(cookies==null || lastTime==null){
//1.显示当前时间到浏览器
//2.创建Cookie对象
Cookie cookie = new Cookie("lastTime",curTime);
cookie.setMaxAge(1*30*24*60*60);//保存一个月
//3.把cookie发送到浏览器保存
response.addCookie(cookie);
response.getWriter().print("你是首次访问本网站,当前时间为:"+curTime);
}
}
Cookie实现自动登录
当我们登录后,服务器会创建一个session,一般这个session都有设置其有效时间。假设我们这里设置有效时间是2小时。如果我们登录后,
HttpSession session=request.getSession();
session.setAttribute("user_name", username);
在登录拦截上:
if(session.getAttribute("user_name")==null){//说明没有登录,或者超时
//异步
if (req.getHeader("x-requested-with") != null&& req.getHeader("x-requested-with") .equalsIgnoreCase("XMLHttpRequest")) {
resp.addHeader("sessionstatus", "timeOut"); //这个头是随意加的,键值对。
resp.addHeader("loginPath", "login.jsp");
return ;
}
else //同步
{
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<script language='javascript' type='text/javascript'>");
out.println("alert('登录信息失效!请你重新登录!');window.parent.location.href='" + req.getContextPath() + "/login.jsp'");
out.println("</script>");
return;
}
}
chain.doFilter(request, response);
当我们登录后,在没有remove session的属性的情况下,session会话会存在服务器两个小时后才会失效。
那么问题来了,当我们关闭浏览器,再重新启动,进入主界面会被登录拦截掉,为什么呢?
正解:
服务器每创建一个session都会有一个相对应的sessionId
,并且服务器会把这个sessionId,会以Cookie
的形式回写给客户端(浏览器),下次同一个用户访问的时候会带这个sessionId
属性。有时候就会出现一个问题,如果不小心关闭了客户端(浏览器),那么Cookie就不存在了。
例如常见的购物车功能,在购物的时候,不小心关闭了浏览器,该用户下次再来访问的时候,上次的记录就不存在了,所以当session创建的时候,可以把对应创建的sessionId存到一个设置有效期的的Cooki
e当中,那么在你关闭浏览器的时候,在较短时间内(session过期就失效),再次打开浏览器,上次的浏览记录依然还是在的。
下面演示自动登录的例子,即关闭浏览器后,只要session还没有过期,则无需在重新登录。
<session-config>
<session-timeout>120</session-timeout>
</session-config>
登录成功,则
//存储session
HttpSession session=request.getSession();
session.setAttribute("user_name", username);
Cookie cookie=new Cookie("userinfo", username+"-"+password);
cookie.setMaxAge(60*60*2); //秒为单位 ,2小时
response.addCookie(cookie);
//将sessionid 持久化
Cookie cookie2=new Cookie("JSESSIONID", session.getId());
cookie2.setMaxAge(60*60*2); //秒为单位 ,2小时
response.addCookie(cookie2);
当我们将sessionid持久化在cookie上,当我们下次访问时,客户端会通过cookies,得到sessionid,即找到了上次的session。
Cookie实现购物浏览记录功能
首页信息:一般显示商品全部信息:List<goods>底下有,最近浏览的商品信息。一般只存4-6个商品。
思路:利用cookies存商品的id和用户名,当点击商品详细信息时,把商品id更新在cookies上。