Cookie
问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?
为了解决这个问题,引入了Cookie技术;
Cookie技术其实就是浏览器端实现的数据临时存储技术,保存一些必要的数据,当访问某些网页需要这些数据时,浏览器自动将数据加到HTTP请求中;
但是具体要保存哪些数据,还有访问哪些网页加上Cookie,还有Cookie信息保存多久都是由服务器决定的。
浏览器的Cookie数据保存位置:
下面就介绍在java servlet编程中如何使用Cookie技术
如果不懂Servlet编程的要先了解servlet,先看另一篇文章:https://www.cnblogs.com/zdl2234/p/11280080.html
创建Cookie对象
Cookie c=new Cookie(String name, String value);//Cookie是作为键值对的形式保存的
设置cookie(可选)
设置有效期
c.setMaxAge(int seconds);//如果不设置有效期,那么数据只会保存到浏览器内存中,浏览器关闭就会失效
设置有效路径
c.setPath(String uri); //如果不设置有效路径,则访问任何网页都会附带这个Cookie数据
响应Cookie信息给客户端
resp.addCookie(c);
Cookie的获取
获取Cookie信息数组
Cookie[] cks=req.getCookies();
/遍历数组获取Cookie信息
使用for循环遍历即可,示例:
if(cks!=null){
for(Cookie c:cks){
String name=c.getName();
String value=c.getValue();
System.out.println(name+":"+value);
}
}
Session
学习 Cookie 之后,解决了不用用户编写请求数据的共享问题。但具体的数据还是由客户端发送过来的,其实某个Servlet需要的数据很可能是别的Servlet已经获取过的,我们可以通过别的Servelt获取需要的数据,就不用每次都要客户端发送了,减少了数据的量,可以提高数据的传输效率。
那么现在要解决的就是Servlet之间的数据共享问题,那么Session就出现了;
原理:用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建 一个 session 对象,用来存储用户请求处理相关的公共数据,并将 此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请 求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其 对应的 session 对象。
与Cookie不同的是,Session的数据是保存在服务器上的,不同的Servlet通过同一个JSESSIONID就可以获取同一个Session;
如何使用Session?( 一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。)
//创建session对象/获取session对象
HttpSession hs=req.getSession();
//如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session队形
//如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储到浏览器内存中
//如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
//设置session存储时间
hs.setMaxInactiveInterval(int seconds);
//注意:
//在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时。
//设置session强制失效
hs.invalidate();
//存储和获取数据
//存储: hs.setAttribute(String name,Object value);
//获取: hs.getAttribute(String name) 返回的数据类型为Object
//注意:
//存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
Session失效处理:
因为Session都有一个存储时间,当访问别的需要用到Session的网页,通过HttpSession hs=req.getSession()获取Session,再通过Session获取之前存的信息;
这时候有两种情况:
1,可以获取之前的信息,这表示Session没有失效,则继续处理;
2,获取信息为null,这表示Session为新创建的,之前的Session失效了,一般这时候就要重定向到可以获取信息的页面了;