Cookie的介绍和使用(cookie设置有效期和cookie信息的获取)
- 问题:
HTTP协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办?难道是让用户再次请求书写吗? - 解决:
使用cookie - 作用:
解决了发送的不同请求的数据共享问题; - 使用:
(1) 创建cookie对象
Cookie c = new Cookie(“mouse”,“thinkpad”)
(2) 响应cookie信息给客户端
response.addCookie©; - 注意:
一个cookie对象存储一条数据。多条数据,可以多创建几个cookie对象进行存储 - 特点:
1、浏览器端的数据存储技术;
2、存储的数据声明在服务器端;
3、临时存储:存储在浏览器的运行内存中,浏览器(客户端)关闭即失效;
4、定时存储:设置了cookie的有效期,存储在浏览器(客户端)的硬盘中,在有效期内符合路径要求的请求都会附带该请求;
5、默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径;只有该有效路径才会附带该cookie信息; - 清除:
在浏览器的清除历史记录中清除; - 注意:
重启服务器,cookie不会失效,因为存在客户端(浏览器) - 功能实现:
(1)设置cookie有效期
//创建cookie对象
Cookie c = new Cookie(“mouse”,“thinkpad”);
//设置cookie有效期,以秒为单位,例:3天
c.setMaxAge(3*24*3600);
//响应cookie数据
response.addCookie(c);
(2)设置cookie的有效路径,只有该请求路径才会携带c的信息;
//设置cookie的有效路径
c.setPath("cookie/abc");
//响应cookie数据
response.addCookie(c);
(3)cookie信息的获取
在目标servlet中获取携带cookie数据
//获取cookie信息数组
Cookie[] cks = request.getCookies();
//遍历数组获取cookie信息
for(Cookie c : cks){
String name = c.getName();
String value = c.getValue();
System.out.println(name + ":" +value);
}
-
注意:
若是没有附带cookie信息,cookie为null,在遍历时需要进行cookie!=null的判断 -
案例(Cookie使用之三天免登陆):
第一步:创建CookieServlet(专门用来做登录cookie校验)
Cookei信息校验:/login/ck (请求url别名)
判断请求中是否携带正确的cookie信息
如果有则校验cookie信息是否正确
如果校验正确则直接响应主页面给用户
如果校验不正确则响应登录页面给用户
没有则请求转发给登录页面
//获取请求信息
//获取cookie信息
//获取cookie信息数组
Cookie[] cks = req.getCookies();
//遍历数组获取cookie信息
//如果csk不等于空,说明登陆过,进行校验
if(csk != null){
//遍历cookie信息
String uid = “”;
for(Cookie c : cks){
if(“uid”.equals(c.getName())){
uid=c.getValue();
}
}
//校验UID是否存在
if("".equals(uid)){
//uid为空,说明登录信息为空,请求转发到登录页面
request.getRequestDispatcher("登陆页面").forwrad(request, response);
return ;
}else{
//校验uid用户信息,查询数据库中,是否有uid对应的这个人
LoginService ls = new LoginServieImpl();
User u = ls.checkUidService(uid);
if(u!=null){
//如果有,直接重定向到登录之后的页面
response.sendRedirect(‘/login/main’)
return;
}else{
//如果没有,直接重定向到登录页面
response.sendRedirect(“/login");
return;
}
}
}else{
//因为cks等于null,说明没有登陆过,重定向到登录页面
response.sendRedirect(“/login”);
}
第二步:在登录的servlet中添加uid到cookie;创建loginServlet用于登录a
在loginservlet中创建cookie信息实现三天免登陆
//查询数据库,查出User对象
User u = 查询操作;
//成功,添加uid到cookie
if(u!=null){
//把uid添加进cookie
Cookie c = new Cookie(“uid”,u.getUid()+””);
//设置cookie的有效期
c.setMaxAge(3*24*3600);
c.setPath(“login/ck”)
//添加cookie信息
response.addCookie(c);
Session介绍和使用
- 问题:
Request对象解决了一次请求内的不同servlet的数据共享问题,那么一个用户的不同请求的处理需要使用相同的数据怎么办呢? - 解决:
使用session技术 - 原理:
用户使用浏览器第一次向服务器发送请求,服务器在接收到请求后,调用对应的servlet进行处理。在处理过程中会给用户创建一个session对象,用来存储用户请求处理相关的公共数据,并将此session对象的JESSIONID以cookie的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求中会附带JSESSIONID,服务器在接收到请求后,调用对应的servlet进行请求处理,同时根据JSESSIONID返回其对应的session对象。保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。 - 特点:
session技术是依赖cookie技术的服务器端的数据存储技术,由服务器进行创建;
存储在服务器端,默认存储时间为30分钟;
每个用户独立拥有一个session;
一次会话(关闭浏览器一次会话结束); - 作用:
解决了一个用户的不同请求的数据共享问题; - 使用:
(1)创建session对象或获取session对象
HttpSession hs = request.getSession();
解释:
1、如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象;
2、如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中;
3、所以这一步为,有session则获取session对象,没有则创建session对象
通过hs.getId()获取JSESSIONID;
4、注意:
JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效;
(2)设置session的存储时间,过时后台会删除
方式一: hs.setMaxInactiveInterval(“秒/5”);
方式二: 将tomcat的web.xml中的<session-config>复制到项目的<web.xml>中
解释:
1、如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID对象存储在浏览器内存中;
2、注意:
在指定的时间内,session对象没有被使用则销毁,如果使用了则重新计时;
(3)设置session强制失效(如点击退出)
hs.invalidate();
(4)存储数据
hs.setAttribute(“键”, 值);
(5)获取数据
hs.getAttribute(“键”);
注意:
存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行;
(6)获取JSESSIONID
hs.getId()
(7)使用时机
一般用户在登录web项目时会将用户的个人信息存储到session中,供该用户的其他请求使用。
- 作用域:
一次会话
在JSESSIONID和session对象不失效的情况下为整个项目内; - 总结:
Session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求在处理时都能获取到同一个session对象。 - Session失效处理:
将用户请求中的JSESSIONID和后台获取到的session对象的JSESSIONID进行比对,如果一致,则session没有失效,如果不一致则证明session失效了;
如果失效则重定向到登录页面,让用户重新登录;
cookie和session的区别
- cookie存储在浏览器(客户端),是客户端技术;
- session的JSESSIONID存储在服务器端,是服务器端技术;
- session依赖于cookie;