1会话技术简介

1.1存储客户端的状态

例如网站的购物系统,因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。

会话技术是帮助服务器记住客户端状态(区分客户端)的。

1.2会话技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。

注意是关闭浏览器,不是只关闭浏览器的标签。

会话技术就是记录这次会话中客户端的状态与数据的。

会话技术分为Cookie和Session:

Cookie:数据存储在客户端本地,减少服务器端的存储压力,安全性不好(例如在公共电脑访问,容易泄露信息),客户端可以清除cookie。

Session:将数据存储到服务器端,安全性相对好,但会增加服务器的压力。

两者结合起来使用最好。

2 Cookie技术

以响应头的形式发送给客户端,键值对方式存,不能存储中文,setHeader

请求头把值传给服务器,用getHeader获取

关注点:

1)服务器怎样将一个cookie写给客户端

2)服务器怎样获取客户端携带的cookie

2.1服务器端向客户端发送一个Cookie

1)创建Cookie对象

2)将Cookie中存储的信息发送到客户端

例:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//向客户端发送Cookie//1创建Cookie对象Cookie cookie=new Cookie("goods","vivo");        //2将Cookie中存储的信息发送到客户端
        response.addCookie(cookie);        }

访问 http://localhost:8080/20190112WEB/SendCookieServlet,抓包

再访问一次,

再访问http://localhost:8080/20190112WEB/index.jsp,还在

重新开一个标签,访问http://localhost:8080/20190112WEB/index.jsp,数据还在

关闭浏览器,再开,没有了

3)设置Cookie在客户端的持久化时间

cookie.setMaxAge(int seconds); ----时间秒

如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),

如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里

过期浏览器自动删除该cookie信息

例:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//向客户端发送Cookie//1创建Cookie对象Cookie cookie=new Cookie("goods","vivo");//设置Cookie持久化时间cookie.setMaxAge(120);        //2将Cookie中存储的信息发送到客户端
        response.addCookie(cookie);        }

访问 http://localhost:8080/20190112WEB/SendCookieServlet,

再访问 http://localhost:8080/20190112WEB/index.jsp

关闭浏览器,再开,再访问http://localhost:8080/20190112WEB/index.jsp

4)设置Cookie的携带路径

cookie.setPath(String path); 相对路径

例:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//向客户端发送Cookie//1创建Cookie对象Cookie cookie=new Cookie("goods","vivo");        //设置Cookie的携带路径cookie.setPath("/20190112WEB");//2将Cookie中存储的信息发送到客户端
        response.addCookie(cookie);        }

结果:

http://localhost:8080/20190112WEB/SendCookieServlet (有)

http://localhost:8080/20190112WEB/index.jsp (没有)

Tips:

1)只写项目路径/20190112WEB,那么就是访问该项目下所有资源时都携带

2)如果写 / ,那么是访问服务器上所有资源时携带(服务器上可能有多个项目)

3)如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

(产生该cookie的web资源:http://localhost:8080/20190112WEB/SendCookieServlet

所在的路径:http://localhost:8080/20190112WEB/ )

例:

把web.xml改为:

结果:

http://localhost:8080/20190112WEB/demo/SendCookieServlet (产生cookie)

http://localhost:8080/20190112WEB/index.jsp (没有)

http://localhost:8080/20190112WEB/demo/index.jsp  (有)

5)删除客户端的cookie

如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

例:

SendCookieServlet:

removeCookieServlet:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//删除客户端的cookie//创建Cookie对象Cookie cookie=new Cookie("goods", "vivo");//设置Cookie的携带路径cookie.setPath("/20190112WEB");//设置Cookie持久化时间cookie.setMaxAge(0);response.addCookie(cookie);}

依次访问:

http://localhost:8080/20190112WEB/SendCookieServlet(产生)

http://localhost:8080/20190112WEB/index.jsp(有)

http://localhost:8080/20190112WEB/removeCookieServlet

http://localhost:8080/20190112WEB/index.jsp(没有了)

2.2服务器端怎么接受客户端携带的Cookie

cookie信息是以请求头的方式发送到服务器端的。

1)通过request获得所有的Cookie:

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

例:

getCookieServlet:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取客户端携带的所有cookie数据Cookie[] cookies=request.getCookies();//通过cookie名称得到相应的值if(cookies!=null){for(Cookie c:cookies){String cookName=c.getName();if(cookName.equals("goods")){String cookValue=c.getValue();System.out.println(cookValue);}}}}

访问:

http://localhost:8080/20190112WEB/SendCookieServlet

http://localhost:8080/20190112WEB/getCookieServlet

注意必须在cookie携带路径上才能获取到

2.3示例:记录上一次访问时间

判断cookie为空,则为第一次。存一个cookie记录时间

第二次,携带过来时间,再存一个时间

AccessServlet:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取当前时间Date date=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String currentTime=sdf.format(date);//日期对象转字符串//创建cookieCookie cookie=new Cookie("lastTime", currentTime);cookie.setMaxAge(60*10); //10分钟//发送cookie
        response.addCookie(cookie);    //获得客户端携带cookie---上次访问时间Cookie[] cookies=request.getCookies();String lastTime=null; //上次访问时间if(cookies!=null){            for(Cookie c:cookies){if(c.getName().equals("lastTime")){lastTime=c.getValue(); //获取值
                }}}//解决中文乱码response.setContentType("text/html;charset=utf-8");if(lastTime==null){//第一次访问response.getWriter().write("您是第一次访问");}else{response.getWriter().write("您上次访问的时间为"+lastTime);}        }

3 Session技术

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,

但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。

所以Session的实现是基于Cookie的,Session需要借助Cookie存储客户的唯一性标识JSESSIONID。

关注三个问题:

1)怎样创建专属于客户端的session区域

2)怎样向session中存取数据

3)session生命周期

发送jsessionid和根据该编号找session域由客户端自己完成,不用关注

3.1获得Session对象

HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回;

如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)

例:

Servlet01:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取session对象(开辟一块session区域)HttpSession session=request.getSession();        //获取JsessionidString id=session.getId();response.getWriter().write("Jsessionid:"+id); //写到前台}

刷新,id也不变

关闭浏览器后,再开,则变化了,因为客户端的jsessionid随着会话结束而消失,所以又开辟了一块新的session。

3.2怎样向session中存取数据

session也是一个域对象。(域对象就是在服务器上的存储对象,所以cookie不是域对象。)

三个方法:

session.setAttribute(String name,Object obj);

session.getAttribute(String name);

session.removeAttribute(String name);

例:

Servlet01:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取session对象(开辟一块session区域)HttpSession session=request.getSession();//存储数据session.setAttribute("goods", "iphone");//获取JsessionidString id=session.getId();response.getWriter().write("Jsessionid:"+id); //写到前台}

Servlet02:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取session对象HttpSession session=request.getSession(); //和Servlet01那里的是同一个对象//取值String value=(String) session.getAttribute("goods"); //强转response.setContentType("text/html;charset=utf-8");response.getWriter().write("goods:"+value);        }

先访问Servlet01,再Servlet02

换个浏览器(或关了重开),只访问Servlet02

3.3持久化存储jsessionid

利用cookie

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取session对象HttpSession session=request.getSession();session.setAttribute("name", "小野猪");String id=session.getId();//手动创建一个存储Jsessionid的cookie对象Cookie cookie=new Cookie("JSESSIONID", id);cookie.setPath("/20190112WEB");cookie.setMaxAge(60*3);//发送cookie对象
        response.addCookie(cookie);response.getWriter().write("JSESSIONID:"+id);}

关闭浏览器重开,还在。

3.4 Session对象的生命周期

创建:第一次执行request.getSession()时创建

销毁:

1)服务器(正常/非正常)关闭时

2)session过期/失效(默认30分钟)

  时间的起算点从不操作服务器端的资源开始计时

  可以在web.xml中进行配置(以覆盖服务器上的时间)

  <session-config>

    <session-timeout>30</session-timeout>

  </session-config>

3)手动销毁session

session.invalidate();( 一般不会销毁)

作用范围:

默认在一次会话中(在一次会话中任何资源公用一个session对象)

4 验证码验证

(之前做的验证码例子和登录的例子)

//获取用户输入验证码
String code=request.getParameter("code");
//获取session中正确的验证码String scode=(String) request.getSession().getAttribute("checkcode_session");if(!code.equals(scode)){request.setAttribute("loginInfo", "验证码输入错误");request.getRequestDispatcher("/login.jsp").forward(request, response);return; //结束方法,下方代码不再执行}    

重点总结:

1 Cookie

1)发送cookie

获得对象:Cookie cookie = new Cookie(name,value)

持久化时间:cookie.setMaxAge(秒)

携带路径:cookie.setPath()

发送:response.addCookie(cookie)

2)获得cookie

Cookie[] cookies = request.getCookies();

cookie.getName();

cookie.getValue();

2 Session

1)获得对象:HttpSession session = request.getSession();

获得JSESSIONID:session.getId();

2)存取数据:

setAttribute(name,value);

getAttribute(name);

3)生命周期

创建:第一次指定request.getSession();

销毁:服务器关闭、session失效/过期、手动session.invalidate();

作用范围:默认一次会话中

3两个实例:记录上一次访问时间和验证码验证

转载于:https://www.cnblogs.com/hzhjxx/p/10260310.html

会话技术CookieSession相关推荐

  1. JAVA web 会话技术CookieSession

    会话技术,指的是从打开浏览器开始访问某个站点,到关闭浏览器的整个过程,称为一次会话. 会话技术分为Cookie和Session. Cookie是指 将数据存储在本地,减少服务器的存储压力,安全性不好, ...

  2. 学习笔记-会话技术CookieSession

    会话技术 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器资源发送请求会话建立,直到有一方断开会话结束 功能:在一次会话的范围内的多次请求间共享数据 方式: 1.客户端会话技术Coo ...

  3. CookieSession会话技术

    第1章 案例:记录用户的上次访问的时间 1.1 需求: 当用户访问某些Web应用时,经常会显示出该用户上一次的访问时间.例如,QQ登录成功后,会显示用户上次的登录时间.通过本任务,读者将学会如何使用C ...

  4. 服务器端会话技术Session|| Session的原理||Session的细节||session的钝化session的活化||session的特点||session与Cookie的区别

    Session 1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中.HttpSession 2. 快速入门:     1. 获取HttpSession对象:   ...

  5. 会话技术 —— Cookie 实现原理 || 在idea编辑器中设置代码的模板

    会话技术 1. 会话:一次会话中包含多次请求和响应.     * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2. 功能:在一次会话的范围内的多次请求间,共享数据 3. ...

  6. javaweb开发后端常用技术_Web后端开发(11)——Session会话技术

    Session 学过了Cookie客户端会话技术,下面我们来学习Session服务器端会话技术. Session概念 Session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务 ...

  7. http访问不到服务器_HTTP及会话技术解析:大魏Java记4

    一.关于HTTP的协议版本 HTTP的全称是Hyper Text Transfer Protocol的缩写,即超级文本传输协议.HTTP协议用于定义浏览器与服务器之间交换数据的过程以及数据本身的格式. ...

  8. PHP会话技术cookie

    为什么要使用会话技术 我们在浏览网站的时候,访问每一个Web页面都是使用HTTP协议来实现的.由于HTTP协议是一个无状态的协议.这就会导致当一个用户请求一个页面以后,再请求该网站的其他页面,HTTP ...

  9. 大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别

    会话技术 – Cookie与Session及其两者的区别 (一)会话技术 一.概述 1. 一个浏览器为了实现某一个功能对服务器产生了多次请求响应.从第一个请求开始访问服务器,会话开始,到最后一个页面访 ...

最新文章

  1. Qlikview 的服务器
  2. sdwan技术发展正蚕食mpls市场—vecloud
  3. k8s部署postgresql(含postgis插件)
  4. Dalvik分析(一)
  5. CF176E Archaeology(set用法提示)
  6. 作者:刘大伟(1984-),男,博士,烟台中科网络技术研究所助理研究员。
  7. Visual Studio二次安装时无法更改安装位置解决方案
  8. Java Scala获取所有注解的类信息
  9. 经典线程同步 关键段CS
  10. Android NDK开发之 opencv manage 免安装生成opencv应用
  11. Wifi Enable 启动过程
  12. 【第八周】程序设计方法学
  13. 中华石杉Java面试突击第一季笔记三(分布式缓存)
  14. android sqlite动态创建表,QT下如何实现SQLite动态创建表
  15. 树莓3b adc模块pcf8591
  16. 【mysql】--explain命令解析
  17. Dubbo-05 20190317
  18. 怎么做好直播引流?直播引流方案介绍
  19. FM加上RDS前途远大
  20. 梦想照进现实:挣扎中的国产操作系统

热门文章

  1. 揭秘:一个月不摸鱼能写多少代码?
  2. OKHTTP3源码和设计模式(下篇)
  3. 【Part2】用JS写一个Blog (node + vue + mongoDB)
  4. Unity* 实体组件系统 (ECS)、C# 作业系统和突发编译器入门
  5. ConfigParser配置文件
  6. 医改大背景下的第三方检验行业发展趋势
  7. Python创建daemon
  8. Java中ArrayList remove会遇到的坑
  9. 数组中查找某个元素是否存在
  10. 十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众