您的位置:首页 > 运维架构 > Tomcat

Tomcat你应该知道的会话及其会话技术(cookie对象,session对象)

2020-08-10 14:39 1246 查看

会话及其会话技术

  • Cookie案例显示上次访问时间
  • Session对象
  • 会话概述

    • (1)客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个utpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是五个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
    • (2)使用ServletContext对象保存数据时,由于同个 Web应用共享的是同一个SnietContext 对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用所购买的,而会将该购物网站中所有用户购买的商品进行结算.这显然也是不可行的。为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

    Cookie对象

    • 当用户浏览器访问Web服务器时,服务器会给客户发送一些信息,这些信息保存在cookie中,这样当浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确响应。
    • 服务器向客户端发送Cookie时,会在HTTP响应字段中增加Set-Cookie响应头字段,Set-Cookie字段头中设置的Cookie会遵循一定的语法规则,如下:
    Set-Cookie:user=itcast;Path=/;

    上述实例中,user代表Cookie的名称,itcast表示Cookie的值Path表示Cookie的属性。

    Cookie API

    为了封装Cookie信息在Servlet API中提供了包含Cookie信息和提取Cookie信息各个属性的方法。
    ###构造方法

    • Cookie仅有一个构造方法具体格式:
    public Cookie(java.lang.String name,java.lang.String value)

    在构造方法中,参数name用于指定Cookie的名称,value用于指定Cookie的值。需要注意的是,Cookie一旦被创建,它的名称就不能被更改,Cookie的值可以为任何值,创建后可更改。

    Cookie类的常用方法

    如下表:

    项目 Value
    String getName() 用于返回Cookie的名称
    void setValue(String newValue) 用于设置Cookie的值
    String getValue() 用于返回该Cookie的值
    void setMaxAge(int expiry) 用于设置Cookie在浏览器客户机上保存的有效秒数
    int getMaxAge() 用于获取Cookie在浏览器客户机上保存的有效秒数
    void setPath(String uri) 用于设置该Cookie项的有效目录路径
    void setPath() 用于返回该Cookie项的有效目录路径
    void setDomain(String pattern) 用于设置该Cookie项的有效域
    String getDomain() 用于返回该Cookie项的有效域
    void setVersion(int v) 用于设置该Cookie项采用的协议版本
    int setVersion() 用于返回用于返回该Cookie项采用的协议版本
    voidsetComment(String purpose) 用于设置该Cookie项的注解部分
    String getComment() 用于返回该Cookie项的注解部分
    void setSecuire(boolean flag) 用于设置该Cookie项是否只能使用安全协议传送
    boolean getSecure() 用于返回该Cookie项是否只能使用安全协议传送

    方法解释:
    1)setMaxAge(int expiry)和getMaxAge()方法
    上面的两个方法用于设置和返回Cookie在浏览器客户机上保存的有效秒数。如果设置的值为一个正整数时,浏览器会将Cooike信息保存到本地硬盘中,从当前时间开始,在没有超过指定的秒数之前,Cookie都保持有效,并且同一台计算机运行该浏览器都可以使用cookie信息;如果设置为负整数,浏览器会将Cookie信息保存在缓存中,当浏览器关闭时,Cookie信息就会被删除;如果设置为0时,则表示通知浏览器立即删除这个Cookie信息。默认情况下,Max-Age属性值为-1。
    2)void setPath(String uri)和void setPath()方法
    上面两个针对于Cookie的Path属性的。如果创建某个Cookie对象没有设置Path属性,那么该Cookie只针对当前访问路径所属的目录及其子目录有效。如果想让某个Cookie项对站点的所有目录显得访问路径都有效,应调用Cookie对象的setPath()方法将其Path属性设置为"/"。
    3)void setDomain(String pattern)和void setDomain()方法

    • (8.5版本以下)
      上面两个是针对cookie的Domain属性的,是用来指定浏览器的访问域。例如某域名为"itcast.cn",那么,当设置Domain属性是,其值必以“.”。开头例如:Domain=.itcast.cn。默认情况下Domain值为当前主机名,浏览器在访问当前主机资源时,会将Cookie信息送给服务器。)
    • (8.5版本以上)
      1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成
      2、必须是数字或字母开头 (所以以前的cookie的设置为.itcast.cn 的机制要改为itcast.cn 即可)
      3、必须是数字或字母结尾
      解决之法: 升级处理cookie的domain的地方即可 由 (.itcast.cn 的机制要改为 itcast.cn )

    注意:Domain属性值不区分大小

    Cookie案例显示上次访问时间

    代码如下:

    package cn.itcast.chapter06.session.example;
    
    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;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    @WebServlet("/cookie")
    
    public class LastAccessServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doPost(req, resp);
    }
    
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    /*
    设置一个Cookie的name:LastAccessTime
    读取上次cookie的访问时间
    */
    String LastAccessTime = null;
    Cookie[] cookies = req.getCookies();  //获取Cookie并存放到cookie数组中
    for (int i=0;cookies==null&&i<cookies.length;i++){
    if ("LastAccess".equals(cookies[i].getName())){
    //如果Cookie名称为LastAccess获取Cookie值
    LastAccessTime = cookies[i].getValue();
    break;
    }
    }
    if (LastAccessTime==null){
    resp.getWriter().print("你是首次访问本站!!");
    }else{
    resp.getWriter().print("你上次访问的时间为:"+LastAccessTime);
    }
    //创建cookie对象,将当前时间作为Cookie发给客户端
    String currenttime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(new Date());
    Cookie cookie = new Cookie("LastAccess",currenttime);
    cookie.setMaxAge(60*60);cookie.setPath("/cookie");
    //发送Cookie
    resp.addCookie(cookie);
    
    }
    }

    代码注释

    cookie.setMaxAge(60*60);

    在默认情况下,Cookie对象的Max-Age的属性值为-1,当浏览器关闭会删除Cookie对象,通过setMaxAge()方法进行设置,例如上面代码设置的时间为1小时。

    cookie.SetPath("/cookie")

    因为每个站点最多存放20个Cookie,因此在创建Cookie对象时一般会设置他的路径,例如上方代码
    会在/cookie回送cookie信息。

    Session对象

    编辑中,请耐心等待






    上一章(servlet必备知识)

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: