• 会话技术cookie和session详解


    什么是会话

    会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

    会话技术解决了什么问题

    每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。

    例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。

    会话技术分类

    会话技术会为两类

    • Cookie

    Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

    • Session

    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

      一定要知道会话技术能解决什么问题才能学以致用。cookie用途典型的例子是保持登录状态,下次进入网页不用再次登录。session典型例子是显示在线总人数,购物车的实现等。

    ookie介绍

    什么是cookie

    Cookie最早是网景公司的前雇员Lou Montulli19933月的发明。

    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookiekey/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

    Cookiehttp协议
    • Cookiehttp协议关系

    CookieHttp协议制定的,并不是Java语言独有的,PHT.NET中也使用了cookie技术,因此只要是和HTTP协议相关,那么就可以使用cookie技术。

    我们知道cookie是服务器创建的一个键值对,并保存在浏览器端。那么服务器是如何将cookie发送给浏览器的呢?

    在服务器端先创建cookie,如 Cookie cookie=new Cookie(String name,String value),其中Cookie可以在javaeeAPI中查到的,详情可参考java_ee API。然后再通过response对象将cookie信息作为响应头发送到浏览器端。我们可以通过HttpWatch抓包工具查看响应信息,可以发现cookie是基于一个Set-Cookie响应头工作的,由于Set-Cookie响应头可以有多个,所以我们可以通过response.addHeader(String name,String value)方法发送Set-Cookie响应头,例如,有两个cookie,分别为one=aaatwo=bbb,其中onetwocookie的名称,aaabbbcookie的值。发送响应头如下所示:

    response.addHeader(Set-Cookie,one=aaa);response.addHeader(Set-Cookie,two=bbb)

    当浏览器再次访问服务器时,会将cookie送还给服务器。那么浏览器是如何将cookie带给服务器的呢?其实通过Cookie请求头传递过去的。请求头Cookie与响应头Set-Cookie有区别,多个cookie对应多个Set-Cookie响应头,但是只对应一个Cookie请求头,格式为:Cookieone=aaatwo=bbb。即多个cookie之间用分号和空格隔开。

    需要注意的是:cookie是不能跨浏览器的。例如,张三首先使用IE浏览器访问服务器,服务器发送了一个cookie,这个cookie只会保存在IE浏览器,如果再使用火狐浏览器访问服务器,服务器会再发送一个cookie个火狐浏览器,在火狐浏览器中不能获取IE浏览器中的cookie,同理IE浏览器也获取不到火狐浏览器中的cookie

    • http协议规定

    Http协议对Cookie做了一些规定,如下所示:

    一个Cookie的大小,最大为4KB

    一个服务器最多向一个浏览器保存20Cookie

    一个浏览器最多可以保存300Cookie

    我们知道,浏览器将服务器发送过来的cookie保存在本地磁盘,如果cookie过多,必然会加大浏览器的压力,因此Http协议对Cookie做了以上规定。

    但是,目前浏览器之间因为竞争,很多都在一定范围内违反了Http规定,例如,一个浏览器最多保存的Cookie个数超过300个。但是也不会出现浏览器允许一个Cookie的大小超过4kB

    cookie常用API及原理

    cookie相关API

    javax.servlet.http.Cookie类用于创建一个Cookieresponse接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的CookieCookie类的方法:

    构造方法

    • public Cookie(String name, String value)

    构造带指定名称和值的 cookie

    成员方法

    • public String getName()

    返回 cookie 的名称

    • public String getValue()

    返回 cookie 的值。

    • public void setMaxAge(int expiry)

    设置 cookie 的最大生存时间,以秒为单位

    • public void setPath(String uri)

    指定客户端应该返回 cookie 的路径。

    cookie示例

    day1114工程下创建一个CookieDemo1Servlet,写入以下代码:

    //1.创建cookie

    Cookie cookie=new Cookie("cookieName","cookieValue");

    //2.通过response对象将cookie响应到浏览器

    response.addCookie(cookie);

    cookie原理

    通过抓包工具我们在次分析一下关于cookie的原理

    1. 当在浏览器上访问http://localhost/day1114/cookieDemo1
    2. 抓取到的http请求与响应信息如下:

    http请求信息

    GET /day1114/cookieDemo1 HTTP/1.1

    Accept: text/html, application/xhtml+xml, */*

    Accept-Language: zh-CN

    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

    Accept-Encoding: gzip, deflate

    Host: localhost

    Connection: Keep-Alive

    http响应信息

    HTTP/1.1 200 OK

    Server: Apache-Coyote/1.1

    Set-Cookie: cookieName=cookieValue

    Content-Length: 0

    Date: Tue, 12 May 2015 05:26:53 GMT

    1. 在次访问上面路径http://localhost/day1114/cookieDemo1

    http请求信息

    GET /day1114/cookieDemo1 HTTP/1.1

    Accept: text/html, application/xhtml+xml, */*

    Accept-Language: zh-CN

    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

    Accept-Encoding: gzip, deflate

    Host: localhost

    Connection: Keep-Alive

    Cookie: cookieName=cookieValue

    通过以上分析,我们通过下面图进行总结:

    持久化cookie

    Cookie持久化

    如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用Cookie类的setMaxAge方法,并给出一个以秒为单位的时间。

    删除持久cookie,可以将cookie最大时效设为0,注意,删除cookie时,path必须一致,否则不会删除

    -1代表的是浏览器关闭后失效.

    Cookie路径

    Cookie的路径是在服务器创建Cookie时设置的,它的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器,可以通过Cookie类的setPath方法来设置cookie的路径.

    关于路径包含关系

    例如,浏览器中保存如下几个cookie,它们的路径分别是:

    aCookie.path=/day10/bCookie.path=/day10/jsps/cCookie.path=/day10/jsps/cookie

    访问路径是:http://localhost:8080/day10/index.jsp

    浏览器发送给服务器的cookie有:aCookie

    访问路径是:http://localhost:8080/day10/jsps/a.jsp

    浏览器发送给服务器的cookie有:aCookiebCookie

    访问路径是:http://localhost:8080/day10/jsps/cookie/b.jsp

    浏览器发送给服务器的cookie有:aCookiebCookiecCookie

    cookie案例-记录上次访问时间

    功能描述

    当访问day10工程下的某一个servlet时,会显示出上一次访问这个资源的时间。

    案例分析
    • 流程分析
    • Ø 使用到的知识点分析

      Cookie cookie=new Cookie(); 创建cookie

      response.addCookie()  cookie添加到http响应中

      request.getCookies();  获取所有的cookie

      代码实现

      VisitServlet

       

      public class VisitServlet extends HttpServlet {

       

      public void doGet(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

       

      doPost(request, response);

      }

       

      public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

      //1.得到系统当前时间

      Date date=new Date();

       

      //2.创建一个cookie

      Cookie cookie=new Cookie("time",date.getTime()+"");

       

      //3.cookie通过response响应到浏览器端

      response.addCookie(cookie);

      }

      }

      ShowTimeServlet

       

      public class ShowTimeServlet extends HttpServlet {

       

      public void doGet(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

       

      doPost(request, response);

      }

       

      public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

      //设置响应编码

      response.setContentType("text/html;charset=utf-8");

      //1.得到名称叫timecookie

      Cookie[] cs = request.getCookies();

      //2.遍历cs,得到cookie

      for(Cookie c:cs){

      if("time".equals(c.getName())){//判断cookie的名称是否有叫time

      long time=Long.parseLong(c.getValue()); //得到名称叫timecookievalue

      Date date=new Date(time); //构造出新的时间

      response.getWriter().write(date.toLocaleString());

      return;

      }

      }

       

      response.getWriter().write("第一次访问:"+new Date().toLocaleString());

       

      }

      }

       

      我们可以将上述两个servlet合成一个servlet处理。

       

      public class ShowCurrentTimeServlet extends HttpServlet {

       

      public void doGet(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

       

      doPost(request, response);

      }

       

      public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

      // 1.设置响应编码

      response.setContentType("text/html;charset=utf-8");

       

      // 2.获取一个名称叫timecookie.

      Cookie cookie = findCookieByName("time", request.getCookies());

      Date now = new Date();

      if (cookie == null) {

      // 说明第一次访问

      response.getWriter().write("第一次访问时间是:" + now.toLocaleString());

      } else {

      // 不是第一次访问

      long time = Long.parseLong(cookie.getValue());

      response.getWriter().write("上次访问时间是:" + new Date(time).toLocaleString());

      }

       

      // 需要将这时访问的时间存储到cookie中。

      cookie = new Cookie("time", now.getTime() + "");

      //持久化cookie

      //cookie.setMaxAge(60*60*24*7);

      cookie.setMaxAge(0);//删除cookie

      response.addCookie(cookie);

       

      }

       

      // 根据名称查找cookie

      private Cookie findCookieByName(String name, Cookie[] cs) {

      if (cs == null || cs.length == 0) {

      return null;

      }

      for (Cookie c : cs) {

      if (name.equals(c.getName())) {

      return c;

      }

      }

      return null;

      }

      }

       

      cookie案例-查看浏览商品记录

      功能描述

      做一个商品页面,当我们访问后,在页面上点击查看商品浏览记录后,可以查看到以前浏览过的商品信息

      案例分析

      Ø 流程分析

    • Ø 使用到的知识点分析

      超连接带参数  <a href=/day10/book?id=1>

      获取请求参数  request.getParameter()

      创建Cookie cookie=new Cookie()

      获取所有cookie   request.getCookies()

      cookie响应到浏览器端   response.addCookies()

       

      代码实现

      Book.jsp

      <a href="/day10/book?id=1">西游记</a><br>

      <a href="/day10/book?id=2">水浒传</a><br>

      <a href="/day10/book?id=3">红楼梦</a><br>

      <a href="/day10/book?id=4">三国演义</a><br>

      <hr>

      <a href="/day10/bookHistory.jsp">查看浏览商品记录</a>

      BookServlet

       

      public class BookServlet extends HttpServlet {

       

      public void doGet(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

       

      doPost(request, response);

      }

       

      public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

      response.setContentType("text/html;charset=utf-8");

      // 1.得到商品的id

      String id = request.getParameter("id");

       

      // 2.id值保存到cookie的名称叫ids这个cookie中。

      Cookie cookie = CookieUtils.findCookieByName("ids",

      request.getCookies());

       

      if (cookie == null) { // 第一次没有ids,就得到null

      cookie = new Cookie("ids", id);

      } else { // 不是第一次,就得到的不是null.

      // 3.得到cookievalue值。

      String ids = cookie.getValue();

       

      // 判断id是否重复

      List<String> list = Arrays.asList(ids.split("-")); //将数组转换成集合。

       

      if (!list.contains(id)) {

      ids = ids + "-" + id;

      }

      cookie = new Cookie("ids", ids);

       

      }

       

      response.addCookie(cookie);

      response.getWriter().write("商品展示成功,<a href='/day10/book.jsp'>继续浏览</a>");

      }

      }

      bookHistory.jsp

      <%

      String[] books = { "西游记", "水浒传", "红楼梦", "三国演义" };

       

      //1.得到所有的cookie,得到名称叫idscookie

      Cookie[] cs = request.getCookies();

      Cookie c = CookieUtils.findCookieByName("ids", cs);

       

      if (c == null) {

      //没有浏览记录

      out.print("无浏览记录");

      } else {

      //有浏览记录

      //2.得到cookievalue

      out.print("浏览记录如下:<br>");

      String ids = c.getValue(); //1-2-4

       

      String[] id = ids.split("-");

       

      for (int i = 0; i < id.length; i++) {

      int bookid = Integer.parseInt(id[i]) - 1;

      out.print(books[bookid] + "<br>");

      }

       

      }

      %>

      【笔试面试题】

      Cookie原理

      持久化cookie与会话级cookie区别

      Cookiehttp协议中的规定

    • session介绍与相关API

      session介绍

      首先,HttpSessionjavax.servlet.http包下的一个接口。从名字来看,我们可以知道HttpSessionHttp协议有一定的关系,但是它并不是由Http协议定义的,而是由Javaweb提供。我们可以在JavaEE api中查看它的详细信息。

      其次,HttpSession是用来进行会话跟踪的接口,我们之前也学过另外一个与会话相关的技术Cookie。在Cookie介绍中我们了解到,Cookie是由Http协议制定的,在请求信息和响应信息中分别对应了Cookie请求头和Set-Cookie响应头,并且Cookie是由服务器创建,保存在客户端。而HttpSession对象也是由服务器创建,但是与Cookie不同的是,它保存在服务器端。

      HttpSession对象是Servlet的三大域对象之一,其他两个域对象是HttpServletRequestServletContext。这三个域中,request的域范围最小,它的域范围是整个请求链,并且只在请求转发和包含时存在;session域对象的域范围是一次会话,而在一次会话中会产生多次请求,因此session的域范围要比request大;application的域范围是最大的,因为一个web应用只有唯一的一个application对象,只有当web应用被移出服务器或服务器关闭它才死亡,它的域范围是整个应用。

      session相关API

      session底层是依赖Cookie的,如果浏览器禁用Cookiesession会依赖URL重写。详情我们会在后面介绍。如何获取HttpSession对象?在服务器端,例如Servlet中,我们通过request对象的getSession()方法获取服务器为当前用户创建的session对象,即:HttpSession session=request.getSession()。而在jsp中,sessionjsp的内置对象,不用获取就可以直接使用。

      我们知道每一个域对象都会有以下三个方法,HttpSession也不例外:

      Ø void setAttribute(String name,Object value):向域中添加域属性;

      Ø Object getAttribute(String name):从域中获取指定名称的属性值;

      Ø Void removeAttribute(String name):移出域中指定名称的域属性

      session生命周期与原理

      session示例

      day10工程下创建一个SessionDemo1Servlet,写入以下代码:

      // 1.获取session

      HttpSession session = request.getSession();

      // 2.session中存储数据据

      session.setAttribute("name", "tom");

      day10工程下创建一个SessionDemo2Servlet,写入以下代码:

      // 1.获取session

      HttpSession session = request.getSession();

      // 2.获取session中信息

      String name = (String) session.getAttribute("name");

      System.out.println(name);

      打开浏览器访问http://localhost/day10/sessionDemo1

      http请求信息

      GET /day10/sessionDemo1 HTTP/1.1

      Accept: text/html, application/xhtml+xml, */*

      Accept-Language: zh-CN

      User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

      Accept-Encoding: gzip, deflate

      Host: localhost

      Connection: Keep-Alive

      http响应信息

      HTTP/1.1 200 OK

      Server: Apache-Coyote/1.1

      Set-Cookie: JSESSIONID=2021FCEFDF31A6DAC8E7CC201F7AF404; Path=/day10/; HttpOnly

      Content-Length: 0

      Date: Tue, 12 May 2015 21:58:39 GMT

      在次访问http://localhost/day10/sessionDemo2

      http请求信息

      GET /day10/sessionDemo2 HTTP/1.1

      Accept: text/html, application/xhtml+xml, */*

      Accept-Language: zh-CN

      User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

      Accept-Encoding: gzip, deflate

      Host: localhost

      Connection: Keep-Alive

      Cookie: JSESSIONID=2021FCEFDF31A6DAC8E7CC201F7AF404

      http响应信息

      HTTP/1.1 200 OK

      Server: Apache-Coyote/1.1

      Content-Length: 0

      Date: Tue, 12 May 2015 22:00:46 GMT

      程序执行完成后,在控制台上打印出tom.

      session对象创建分析

      如果请求时,cookie中有jsessionid这个cookie,那么我们通过request.getSession()时,

      就会根据jsessionid值查找sessionid,如果查找到,会使用已有的,如果没有查找到,会创建。

      如果请求时,cookie中没有jsessionid这个cookie,那么request.getSession()就会创建一个新的session对象.

      session对象销毁分析

      问题:浏览器关闭了,session对象就销毁了?

      不对,session的销毁与关闭浏览器无关.

      session对象什么时候销毁?

      1.关闭服务器

      2.默认超时

      tomcat/conf/web.xml文件中设置了session默认超时时间

         <session-config>

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

      </session-config>

      默认30分钟超时

      3.可以设置session超时时间

       void setMaxInactiveInterval(int interval)  

      4.销毁session

      invalidate();

      session原理
    • 第一次访问,请求中不存在jsessionid值,这时发送请求到服务器端就会创建HttpSession对象.工将sessionid值存储到cookie中响应到浏览器端

      当下一次在请求时,这时会在请求中存在jsessionid,到服务器端后,就会根据jsessionid值,查找指定idsession对象。

      如果查找到,就直接使用,而不会重新创建。如果没有查找到,会重新创建.

      HttpSession session=request.getSession();

      扩展

      HttpSession session=request.getSession(true/false);

      如果值是true与无参数一样.

      如果是false,它不会重新创建session对象,会返回null值。

       

      session案例-购物车

      功能描述

      有一个商品页面,可以点击超连接将商品添加到购物车,并可以查看购物车中商品信息

      案例分析

      Ø 流程分析

    • Ø 使用到的知识点分析

      购物车使用的数据结构 Map<String,Integer>

      获取session    request.getSession()

      解决请求参数乱码   new String(name.getBytes(iso8859-1),utf-8)

       

      代码实现

      Productlist.jsp

      <table border='1' width="65%" align="center">

        <tr>

        <td>商品名称</td>

        <td>操作</td>

        </tr>

        <tr>

        <td>洗衣机</td>

        <td><a href="/day10/addProductToCart?name=洗衣机">添加到购物车</a></td>

        </tr>

        <tr>

        <td>电视机</td>

        <td><a href="/day10/addProductToCart?name=电视机">添加到购物车</a></td>

        </tr>

        <tr>

        <td>缝纫机</td>

        <td><a href="/day10/addProductToCart?name=缝纫机">添加到购物车</a></td>

        </tr>

        <tr>

        <td>打火机</td>

        <td><a href="/day10/addProductToCart?name=打火机">添加到购物车</a></td>

        </tr>

        

        </table>

      AddProductToCartServlet

       

      public class AddProductToCartServlet extends HttpServlet {

       

      public void doGet(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

       

      doPost(request, response);

      }

       

      public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

      response.setContentType("text/html;charset=utf-8");

       

      // 1.获取商品名称

      String name = request.getParameter("name");

      // 2.解决乱码

      name = new String(name.getBytes("iso8859-1"), "utf-8");

      // 3.获取购物车

      HttpSession session = request.getSession();

      Map<String, Integer> cart = (Map<String, Integer>) session

      .getAttribute("cart");

       

      // 4.判断购物车是否存在

      Integer count = null; //代表的是商品数量

      if (cart == null) {

      cart = new HashMap<String, Integer>();

      // cart.put(name, 1);

      count = 1;

      } else {

      // 如果购物车存在,我们需要考虑商品在购物车中是否存在。

      count = cart.get(name);

      if (count == null) {

      // 说明购物车中无此商品

      count = 1;

      } else {

      // 如果有此商品,将数量加1

      count += 1;

      }

       

      }

      cart.put(name, count);

      // 5.将购物车存储到session.

      session.setAttribute("cart", cart);

       

      response.getWriter().write("添加成功,<a href='/day10/productlist.jsp'>继续购物</a>,<a href='/day10/cart.jsp'>查看购物车</a>");

       

      }

       

      }

      Cart.jsp

       

      <table border='1' align="center" width="65%">

       

      <tr>

      <td>商品名称</td>

      <td>商品数量</td>

      </tr>

       

      <%

      //1.得到session

      HttpSession mysession = request.getSession();

       

      //2.得到购物车

      Map<String, Integer> cart = (Map<String, Integer>) mysession

      .getAttribute("cart");

       

      //3.判断购物车是否存在

      if (cart == null || cart.size() == 0) {

      out.print("购物车中无商品<br>");

      } else {

      //4.遍历cart

      for (String name : cart.keySet()) {

       

      out.print("<tr><td>" + name + "</td><td>" + cart.get(name)

      + "</td></tr>");

       

      }

      }

      %>

       

      </table>

       

       

       

       

      url重写

      什么是url重写

      如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求头的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)

      url重写作用

      当客户机不接受cookie时,server就使用URL重写作为会话跟踪的基本方式.URL重写,添加了附加数据(会话ID)到请求的URL路径上. 

      会话ID必须被编码作为该URL字符串中的路径参数。该参数的名称为jsessionid,

      简单说就是cookie禁用了jsessionid就不能携带,那么每次请求,都是一个新的session对象。

      如果想要使用同一个session对象,可以使用url重写.

      url重写实现

      response. encodeRedirectURL(java.lang.String?url)

      用于对sendRedirect方法后的url地址进行重写。

      response. encodeURL(java.lang.String?url)

      用于对表单action和超链接的url地址进行重写

      session案例-一次性验证码

      验证码生成及使用分析
      在登陆操作基础上添加验证码

       

      【笔试面试题】

      Session原理

      浏览器关闭后,session就消失了?

      禁用cookie后的session处理

      什么是url重写及作用

      Cookiesession会话的区别

      【重点总结】

      HttpSession是我们web开发中,很重要的一个概念,它与HttpServlet

      Request,ServletContext,是我们常用的三个域对象。

      对于HttpSession大家需要掌握

      1. HttpSession的获取与销毁(生命周期)

      2. HttpSession域对象常用API

      理解url重写的作用

      可以自己完成购物车案例

      【总结】

      Jsp需要大家掌握其基本原理,jspservlet的区别及jsp中的三种脚本。

      Cookiesession都是我们javaweb开发中常用的会话技术,首先大家要掌握会话技术解决了什么问题,

      对于cookiesession大家要掌握以下内容

      1. cookiesession原理

      2. cookiesession常用API

      3. cookiesession案例

    Ø 使用到的知识点分析

    Cookie cookie=new Cookie(); 创建cookie

    response.addCookie()  cookie添加到http响应中

    request.getCookies();  获取所有的cookie

    代码实现

    VisitServlet

     

    public class VisitServlet extends HttpServlet {

     

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    doPost(request, response);

    }

     

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    //1.得到系统当前时间

    Date date=new Date();

     

    //2.创建一个cookie

    Cookie cookie=new Cookie("time",date.getTime()+"");

     

    //3.cookie通过response响应到浏览器端

    response.addCookie(cookie);

    }

    }

    ShowTimeServlet

     

    public class ShowTimeServlet extends HttpServlet {

     

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    doPost(request, response);

    }

     

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    //设置响应编码

    response.setContentType("text/html;charset=utf-8");

    //1.得到名称叫timecookie

    Cookie[] cs = request.getCookies();

    //2.遍历cs,得到cookie

    for(Cookie c:cs){

    if("time".equals(c.getName())){//判断cookie的名称是否有叫time

    long time=Long.parseLong(c.getValue()); //得到名称叫timecookievalue

    Date date=new Date(time); //构造出新的时间

    response.getWriter().write(date.toLocaleString());

    return;

    }

    }

     

    response.getWriter().write("第一次访问:"+new Date().toLocaleString());

     

    }

    }

     

    我们可以将上述两个servlet合成一个servlet处理。

     

    public class ShowCurrentTimeServlet extends HttpServlet {

     

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    doPost(request, response);

    }

     

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    // 1.设置响应编码

    response.setContentType("text/html;charset=utf-8");

     

    // 2.获取一个名称叫timecookie.

    Cookie cookie = findCookieByName("time", request.getCookies());

    Date now = new Date();

    if (cookie == null) {

    // 说明第一次访问

    response.getWriter().write("第一次访问时间是:" + now.toLocaleString());

    } else {

    // 不是第一次访问

    long time = Long.parseLong(cookie.getValue());

    response.getWriter().write("上次访问时间是:" + new Date(time).toLocaleString());

    }

     

    // 需要将这时访问的时间存储到cookie中。

    cookie = new Cookie("time", now.getTime() + "");

    //持久化cookie

    //cookie.setMaxAge(60*60*24*7);

    cookie.setMaxAge(0);//删除cookie

    response.addCookie(cookie);

     

    }

     

    // 根据名称查找cookie

    private Cookie findCookieByName(String name, Cookie[] cs) {

    if (cs == null || cs.length == 0) {

    return null;

    }

    for (Cookie c : cs) {

    if (name.equals(c.getName())) {

    return c;

    }

    }

    return null;

    }

    }

  • 相关阅读:
    价值理论的出发点和落脚点都是人--以人为本
    价值理论是人类决策和行为的标尺
    事实判断和价值判断
    什么是价值理论?---人们认识世界和改造世界的过程可分解为四个基本阶段
    大人只看利弊 小孩才分对错
    为人处世、事实判断和价值判断皆不可少--人类认识客观事物的标尺:对错与利弊
    知行之间--价值与真理--行动的标尺
    事实判断与价值判断之间的桥梁就是人的需要
    10分钟梳理MySQL核心知识点
    postman设置环境变量,实现一套接口根据选择的环境去请求不同的url
  • 原文地址:https://www.cnblogs.com/MessiAndDream/p/6060546.html
Copyright © 2020-2023  润新知