一 : 会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话,会话技术就是记录这次会话中客户端的状态与数据的.会话技术是帮助服务器记住客户端状态的.
二 : Cookie
Cookie
是将用户的数据存储到客户端的技术.
服务器端将Cookie发送到客户端 :
cookie.setPath(" ")
如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建COOKIE对象 Cookie cookie = new Cookie("name", "jingjing"); //为cookie设置持久化时间,cookie信息在硬盘上存的时间 cookie.setMaxAge(60*10); //为cookie设置携带的路径// cookie.setPath("/WEBpro/sendcook");//访问sendcookie资源时携带这个cookie //访问WEBpro下任何资源的时候都携带这个cookie cookie.setPath("/WEBpro"); //访问服务器下的所有资源都携带这个cookie// cookie.setPath("/"); //将cookie中有存储的信息发送到客户端 response.addCookie(cookie); }
服务器端接受客户端携带的Cookie :
显示最后一次访问时间demo
//获得当前时间 Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss"); String time = format.format(date); //创建cookie记录当前最新访问时间 Cookie cookie = new Cookie("accessTime", time); cookie.setMaxAge(60*10); response.addCookie(cookie); //获得客户携带的cookie String lastTime = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cook : cookies) { if (cook.getName().equals("accessTime")) { lastTime = cook.getValue(); } } } //设置显示中文 response.setContentType("text/html;charset=UTF-8"); if (lastTime == null) { response.getWriter().write("您是第一次访问,祝愉快"); }else { response.getWriter().write("上次的访问时间是 : " + lastTime); } }
删除客户端的cookie
删除客户端存储的cookie信息,使用同名同路径的持久化时间为0的cookie进行覆盖.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //删除客户端name:"..."的cookie信息 Cookie cooie = new Cookie("name", ""); //将path设置与要删除的cookie path一致 cooie.setPath("/WEBpro"); //设置时间是0 cooie.setMaxAge(0); response.addCookie(cooie); }
三 : Session技术
Session
技术是将数据存储在服务器端的技术,会为每一个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间. Session的实现是基于Cookie,Session需要借助Cookie存储客户端唯一标识JESSIONID
获取Session对象
//创建属于该客户端(会话)私有的session区域 /* * 内部判断该客户端是否在服务器已经存在session,如果客户端在服务器不存在session,那么创建一个 * 新的session对象 * 如果该客户端在服务器已经存在session,获得已经存在的session返回. * */ HttpSession session = request.getSession(); String id = session.getId();
当浏览器关闭,Session
并没有销毁,而是Cookie中保存的JESSIONID
没有了,没有了这把钥匙,就无法在服务器中寻找对应的Session
空间
手动创建一个JSESSIONID的cookie,为该cookie设置持久时间
HttpSession session = request.getSession(); String id = session.getId(); //回写前手动创建一个JSESSIONID的cookie,为该cookie设置持久时间 Cookie cookie = new Cookie("JSESSIONID", id); cookie.setPath("/WEBpro/"); cookie.setMaxAge(10*60); response.addCookie(cookie); session.setAttribute("name", "hello"); response.getWriter().write(id);
Session域对象
Session 是一个域对象
有如下方法
session.setAttribute(String name,Object obj); session.getAttribute(String name); session.removeAttribute(String name);
//从session中获得存储数据 HttpSession session = request.getSession(); String name = (String)session.getAttribute("name"); response.getWriter().write(name);
四 : Session对象的生命周期
创建 :
第一次request.getSession()
销毁 :
① : 服务器关闭时(非正常)
② : session过期/失效(默认30分钟)
可以在web.xml中配置
超时时间是从不操作服务器端的资源开始计时.
<session-config> <session-timeout>30</session-timeout></session-config>
③ : 手动销毁session
session.invalidate();
五 : session原理
每一个客户端(用户)对应服务器端一块内存区域.通过客户端存的编号(JSESSIONID)找寻相应的内存空间,如果找不到则创建新的.Cookie
属于会话级别的,当一次会话结束时,cookie
即可消失,所以想要保存cookie
就要设置cookie
的存活时间,而Session
在服务器中存储,客户端关闭,并不会让Session
消失.依然保存在服务端.
原理
作者:TianTianBaby223
链接:https://www.jianshu.com/p/f07065587683