从打开一个浏览器到访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端状态与数据的
会话技术分为Cookie和Session
Cookie:数据存储在客户端本地,减少服务器端的储存压力,安全性不好,客户端可以清除Cookie
Session:将数据储存在服务器端,安全性相对较好,但增加服务器压力
Cookie
将数据储存到客户端
1.服务器端向客户端发送一个Cookie
创建Cookie:Cookie cookie=new Cookie(String cookieName,String cookieValue);
例如:Cookie cookie=new Cookie("username","zhangsan");//cookie会以响应头的形式发送给客户端,Cookie不能存储中文
设置Cookie在客户端的持久化时间:cookie.setMaxAge(int seconds);--时间秒
注意:如果不设置持久化时间,cookie会储存在浏览器内存中,关闭浏览器cookie信息销毁,如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里
例如:cookie.setMaxAge(10*60);//设置cookie在浏览器中存储时间10分钟,过期自动删除
设置Cookie携带路径:cookie.setPath(String path);
注意:如果不设置路径,访问产生该cookie的web资源所在路径,并且web路径下都携带cookie信息
例如:cookie.setPath("/WEB01");//代表访问WEB01应用中任何资源都携带cookie
向客户端发送cookie:response.addCookie(Cookie cookie);
删除客户端cookie:使用同名同路径持久化时间为0的cookie覆盖即可
2.服务器端接收客户端发送的cookie
通过request获得所有Cookie:Cookie[] cookie=request.getCookies();
遍历Cookie数组,通过Cookie名称获得:
for(Cookie cookie:cookies){ if(cookie.getName().equal(cookieName)){ String cookieValue=cookie.getValue(); } }
Session
将数据储存在服务器端,为每个客户端创建一块内存空间储存数据,但客户端需要每次都携带一个标识ID去服务器找内存空间。所以说Session的实现基于Cookie,Session需要借助于Cookie储存客户的唯一性标识JSESSIONID
1.获得Session对象:HttpSession session=request.getSession();
获取专属于当前会话的Session对象,如果服务器端没有给会话的Session对象,会创建一个新的Session返回,如果已经有了属于该会话的Session,直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在Session了)
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建属于该客户端(会话)的私有的session区域 // request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session // 如果该客户端在此服务器不存在session 那么就会创建一个新的session对象 // 如果该客户端在此服务器已经存在session 那么就获得已经存在的该session返回 HttpSession session=request.getSession(); String id=session.getId();//该session对象的编号id response.getWriter().write("JSESSIONID:"+id); }
2.Session域中存取数据的三种方法
session.setAttribute(String name,Object obj)
session.setAttribute(String name)
session.removeAttribute(String name)
3.Session对象生命周期
创建:第一次执行request.getSession()时创建
销毁:服务器(非正常)关闭时
session失效(默认30分钟)
手动销毁session:session.invalidate();
作用范围:默认在一次会话中,也就是说在一次会话中任何资源公用一个session对象