Cookie对象与HttpSession
Cookie
- @desc Cookie对象与HttpSession对象的作用是
- 维护客户端浏览器与服务端的会话状态的两个对象。
- 由于HTTP协议是一个无状态的协议,
- 所以服务端并不会记录当前客户端浏览器的访问状态,
- 但是在有些时候我们是需要服务端能够记录客户端浏览器的访问状态的,
- 如获取当前客户端浏览器的访问服务端的次数时就需要会话状态的维持。
- 在Servlet中提供了Cookie对象与HttpSession对象用于维护
- 客户端与服务端的会话状态的维持。
- 二者不同的是Cookie是通过客户端浏览器实现会话的维持,
- 而HttpSession是通过服务端来实现会话状态的维持。
*/
Cookie的java实现
代码1
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/CookieDemo.do",loadOnStartup = 10)
public class CookieDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建一个cookie
Cookie cookie= new Cookie("userName","Gavin");
//在响应时添加Cookie
resp.addCookie(cookie);
//第一次访问时获取Cookie为null,再次访问时就可以获取到的Cookie
String cookie2 = req.getHeader("Cookie");
System.out.println(cookie2);
}
}
状态Cookie与持久化Cookie
代码1中的Cookie是状态Cookie,在重新打开浏览器访问项目中的其他资源时并不会携带该Cookie,
Ø Cookie使用字符串存储数据
Ø Cookie使用Key与Value结构存储数据
Ø 单个Cookie存储数据大小限制在4097个字节
Ø Cookie存储的数据中不支持中文,Servlet4.0中支持
Ø Cookie是与域名绑定所以不支持跨一级域名访问
Ø Cookie对象保存在客户端浏览器内存上或系统磁盘中
Ø Cookie分为持久化Cookie(保存在磁盘上)与状态Cookie(保存在内存上)
Ø 浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,
Chrome浏览器为50个
Ø 浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。
3.2.2 Cookie对象的创建
Cookie cookie = new Cookie(“key”,“value”)
通过new关键字创建Cookie对象
response.addCookie(cookie)
通过HttpServletResponse对象将Cookie写回给客户端浏览器。
3.2.3 Cookie中数据的获取
通过HttpServletRequest对象获取Cookie,返回Cookie数组。
Cookie[] cookies = request.getCookies()
3.2.4 Cookie不支持中文解决方案
在Servlet4.0版本之前的Cookie中是不支持中文存储的,如果存储的数据中含有中文,代码会直接出现异常。我们可以通过对含有中文的数据重新进行编码来解决该问题。在Servlet4.0中的Cookie是支持中文存储的。
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
可以使用对中文进行转码处理
URLEncoder.encode(“content”,“code”)
将内容按照指定的编码方式做URL编码处理。
URLDecoder.decode(“content”,“code”)
将内容按照指定的编码方式做URL解码处理。
3.2.5 Cookie持久化和状态Cookie
状态Cookie:浏览器会缓存Cookie对象。浏览器关闭后Cookie对象销毁。
持久化Cookie:浏览器会对Cookie做持久化处理,基于文件形式保存在系统的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。
当Cookie对象创建后默认为状态Cookie。可以使用Cookie对象下的cookie.setMaxAge(60)方法设置失效时间,单位为秒。一旦设置了失效时间,那么该Cookie为持久化Cookie,浏览器会将Cookie对象持久化到磁盘中。当失效时间到达后文件删除。
3.2.6 Cookie跨域问题
域名分类:
域名分为顶级域、顶级域名(一级域名)、二级域名。
域名等级的区别:
一级域名比二级域名更高级,二级域名是依附于一级域名之下的附属分区域名,即二级域名是一级域名的细化分级。例如:baidu.com 为一级域名,news.baidu.com为二级域名。
Cookie不支持一级域名的跨域,支持二级域名的跨域。
Cookie对象总结
Cookie对于存储内容是基于明文的方式存储的,所以安全性很低。不要在Cookie中存放敏感数据。在数据存储时,虽然在Servlet4.0中Cookie支持中文,但是建议对Cookie中存放的内容做编码处理,也可提高安全性。
HttpSession的java实现
@WebServlet(urlPatterns ="/HttpSessionDemo.do" )
public class HttpSessionDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*获得Httpsession对象
由于是接口, 所以要通过req获取
从req中获取session的cookie
如果获取失败, 则会认为上次会话已经结束,
再这里开启一个新的会话, 创建一个新的httpsession并返回给浏览器
如果获取成功,则根据sessionID再服务器中找到对应的httpsession对象
找到了则返回找到的httpsession
如果没找到,则创建新的httpsession并将sessionId以cookie的形式发送到resp对象中相响应给浏览器
*/
/*httpsession一般用于保存用户的 登录信息
用户的权限
用户的其他信息*/
HttpSession session = req.getSession();
session.setAttribute("userName","Gavin");
session.setAttribute("userPwd","123456");
session.setAttribute("userLevel","1");
}
}
浏览器访问---- 确实是同一个jessionid
细节-----
第一次访问时,请求行里没有Cookie JESSISION的信息,响应行里有
再次访问
图解HttpSession
有几种情况,再次访问时不会携带JESSISIONID:
浏览器端----
1,再访问之前已经关闭浏览器,打开浏览器再次访问,不会携带之前的JESSIONid,服务器会视为第一次访问;
原理是-----由于创建的Httpsession对象会将生成的jessisionID以cookie的形式发送给给浏览器,此时的Cookie为状态Cookie,存放于内存之中,关闭浏览器再次打开就会丢失原来的Cookie信息;
2,手动清除Cookie
3,达到最大不活动时间(一般为30min)----即两次访问时间之间的间隔超过指定时间服务器也会销毁原来Jessionid,
4,服务器重启也会丢失原来的JEssionID;
5,手动设置HttpSession不可用
@WebServlet(urlPatterns = "/HttpSessionLearn.do")
public class HttpSessionLearn extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//HttpSession 4.0已经支持中文了
session.setAttribute("银行卡号","12345678910");
session.invalidate();//HttpSession不可用
}
}
这里输出NULL,说明手动设置JESSIONID不可用生效
HttpSession的销毁方式
HttpSession的销毁方式有两种:
Ø 通过web.xml文件指定超时时间(最大不活动时间)
Ø 通过HttpSession对象中的invalidate()方法销毁当前HttpSession对象
我们可以在web.xml文件中指定HttpSession的超时时间,当到达指定的超时时间后,容器就会销毁该HttpSession对象,单位为分钟。该时间对整个web项目中的所有HttpSession对象有效。时间的计算方式是根据最后一次请求时间作为起始时间。如果有哪个客户端浏览器对应的HttpSession的失效时间已到,那么与该客户端浏览器对应的HttpSession对象就会被销毁。其他客户端浏览器对应的HttpSession对象会继续保存不会被销毁。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Cookie与HttpSession对象总结
1,Cookie是存放在浏览器器中的用于存放重要的的信息显得很不安全;
2,HttpSession是存放在服务器上的,一般是比较安全的;
3,Cookie的生命周期比较短,在没有特殊设置的情况下退出浏览器即会消除;
4,httpsession的生命周期是不确定的,第一次访问创建到下一次访问时间如果超时则会清除;服务器重启也会清除;
5,Cookie存放的信息很少,一般浏览器也会限制Cookie存放的数量;
单个cookie保存的数据不能超过4K,很多浏览器都限制一个域名保存cookie的数量。而HttpSession没有容量以及数量的限制。
6我们可以在HttpSession对象中存储数据,但是由于HttpSession对象的生命周期不固定,所以不建议存放业务数据。一般情况下我们只是存放用户登录信息。