Cookie、Session解析

1.  Cookie

1什么是cookie

Cookie就是浏览器写在你本地计算机上的一个一个文本文件,大小不能超过4k

1.1.1.           cookie类的学习

1. 与 Cookie 操作相关的方法:

1>public Cookie(String name,String value)

构造方法,用来创建一个名字为name和值为value的cookie对象

       Ø  setValue()/getValue() 修改 Cookie 的值,得到 Cookie 中指定的值

       Ø  getName() 得到 Cookie 的名字

       Ø  setMaxAge()/getMaxAge() 设置 Cookie 过期的时间,单位是秒

       Ø  setPath()/getPath() 用来设置 Cookie 的保存路径,这只是一个虚拟路径

2>response接口

AddCookie()把cookie对象写到浏览器

原理:添加了一个set-cookie的响应头信息

3>request接口

Cookie[]getCookies()得到浏览器发送回来的cookie数组

2. Cookie 的写入:

 演示:在 Servlet 中创建一个Cookie("name","admin"),使用 addCookie()添加到浏览器端

         注意:在默认的情况下,Cookie是不保存的。当浏览器关闭,Cookie 就消失了。

1.1.2.           增加cookie

public class AddCookieServlet extends HttpServlet {

 

     /**

      * Get method

      */

     public void doGet(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

         //增加cookie

         //原理,服务器产生cookie,通过responsecookie响应到浏览器,浏览器存储cookie到本地缓存目录

         //1.创建cookie

         Cookie cookie = new Cookie("name", "admin");

         //1.1 设置cookie的有效期。cookie的默认有效期是浏览器关闭,不会产生文本小文件,因为cookie数据在浏览器内存中。如果想产生文本小文件,必须设置有效期

         cookie.setMaxAge(60*60*24*7);//单位秒,7

         //1.2 浏览器默认每次请求服务器都携带cookie到服务器,这样不好,因为只有需要读取cookie的服务器资源才读取cookie,其他资源不要读取

         //设置cookie的有效路径解决,有效路径就是指定服务器特定资源才可以读取cookie数据,这样浏览器只会在访问特定的资源才会携带cookie到服务器

         //cookie的默认有效路径是当前工程名字,所以浏览器只要访问当前服务器和当前的工程名字都会携带cookie到服务器

         //要求:只允许GetCookieServlet读取cookie数据

         //cookie.setPath(路径);路径格式:/项目名字/资源路径,浏览访问服务器这个资源路径的时候才会携带cookie

         cookie.setPath(request.getContextPath()+"/getCookie");

         //2.cookie写入到浏览器,response响应cookie数据是通过响应头传递给浏览器

         //Set-Cookie: name=admin

         response.addCookie(cookie);

         //输出写入成功

         response.getOutputStream().write("cookie写入浏览器成功".getBytes());

     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

         doGet(request, response);

     }

}

 

1.1.3.           查询cookie

public class GetCookieServlet extends HttpServlet {

 

     /**

      * Get method

      */

     public void doGet(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

        

         //查询cookiecookie会通过请求头数据传递给服务器,请求数据格式:Cookie: name=admin

         //获取cookie数据2个方法

         //方法1request.getHeader("Cookie")

         //方法2cookie的获取已经被request封装好了,可以直接获取当前网站所有cookie对象

         Cookie[] cookies = request.getCookies();

         //打印cookie中存储的name

         if(cookies!=null){

              for (Cookie cookie : cookies) {

                   if(cookie.getName().equals("name")){

                       //cookie.getName()获取cookie里面存储的键

                       //cookie.getValue()获取cookie里面存储的值

                       String value = cookie.getValue();

                       //打印value

                       response.getWriter().write(value);

                   }

              }

         }

        

 

     }

 

 

 

1.1.4.           删除cookie

1.      手动清除浏览器缓存文件

2.      服务器创建一个一模一样的cookie(name和path要一样),value设置null或“”空字符串,有效期设置为0,让cookie为默认有效期。这样就会新创建的cookie会覆盖客户端一样的cookie文件。‘

注意:

浏览器与服务器传输中文都要经过url编码的,cookie的数据是通过请求头与响应头来传递的,所以在请求头与响应头不会主动url编码和url解码需要我们手动来完成

一般没有在请求头与响应头传输中文的需求。

代码

         cookie写入的时候需要手动进行url编码
 
       
URLDecoder.decode(Stringstr,"utf-8");

         cookie读取的时候需要手动进行url解码

URLEncoder.encode(String str,"utf-8");

 

1.2.  cookie的生命周期

默认的生命周期为,服务器创建并且输入给浏览器,浏览器关闭cookie失效

设置生命周期:通过setMaxAge()设置有效期

1.3.  总结

服务器端生成cookie数据,通过响应头传给浏览器,在浏览器本地生成cookie的文本文件最大为4k。

浏览器每次请求都会携带与cookie有效路径一样的cookie数据通过请求头的带到服务器端。

Cookie 存储在客户端,对于安全性来说是不安全的,对于存储一些重要的数据必要时进行加密处理。

2.  Session

2.1.  会话Session概述

1.什么是会话:

从用户打开浏览器开始访问网站到关闭浏览器窗口时,我们就认为浏览器与服务器进行了一次会话。会话提供了一种方法,它可以让服务器可以识别多次请求或访问服务器的同一个用户,并且服务器会存储有关该用户的信息。会话在指定的时间段内有效。

2.2.  session技术特点

1>    运行在服务端,由服务器为每个浏览器创建单独的存储空间对象,称为会话对象。

2>    每一个用户都有自己的会话对象,不同的浏览器代表不同的用户。

3>    会话对象是一个域对象,主要用于存储每个用户自己的数据,不同的用户之间数据不能共享。

2.3.  session的使用

1、会话的使用

1>由服务器创建,在用户第一次访问服务器的时候会创建一个会话,调用下面的方法创建同一个用户每次访问都是同一个会话。

2>创建 Session 对象的方法:HttpSession request.getSession()

3> 不同的浏览器得到的会话对象是不同的。注:同一个浏览器不同的标签页,是同一个会话。

2.4.  HttpSession 类中的方法:

session 也是一个域对象,用来保存不同用户的数据。

●域范围的大小:

request(一次请求) < session(一次会话内) <servletContext(整个应用程序范围内)

Ø  void setAttribute(String name, Object value) 向会话中保存数据

Ø  void removeAttribute(String name) 从会话中删除指定的数据

Ø  Object getAttribute(String name) 从会话中得到指定的数据

Ø  String getId() 得到会话的 ID,一个 32 位的十六进制数,在服务上唯一。

 

1、  session 域对象演示

2.4.1.           session写入数据

public void doGet(HttpServletRequest request,HttpServletResponse response)

              throwsServletException, IOException {

        

         //创建 Session 对象的方法: HttpSessionrequest.getSession()

         //session对象的方法

         //   void setAttribute(String name, Object value) 向会话中保存数据

         //   void removeAttribute(String name) 从会话中删除指定的数据

         //   Object getAttribute(String name) 从会话中得到指定的数据

         //   String getId() 得到会话的 ID,一个 32 位的十六进制数,在服务上唯一。

        

         //session域对象的作用

         //   作用域,一次会话内,默认有效期

         //   session的数据是存储在服务器内存里面

         //1.创建session对象

         HttpSession session =request.getSession();

         //2.session写入数据

         session.setAttribute("loginUser","admin");

 

     }

2.4.2.           读取session数据

public void doGet(HttpServletRequest request, HttpServletResponseresponse)

              throwsServletException, IOException {

         //获取session域对象里面的数据,loginUser数据

         //1.获取session对象

         HttpSession session =  request.getSession();

         //2.读取session中的loginUser

         Object object = session.getAttribute("loginUser");

         if(object!=null){

              response.getWriter().write(object.toString());

         }

 

     }

2.4.3.           演示不同浏览器获得不同的session对象

     publicvoid doGet(HttpServletRequestrequest, HttpServletResponse response)

              throwsServletException, IOException {

         //session对象的方法String getId() 得到会话的ID,一个 32 位的十六进制数,在服务上唯一。

         //sessionid是会话对象的唯一标识符

         //演示不同浏览器获得不同的session对象

         //不同浏览器输出sessionid不一样,就说明不同浏览器获得的session对象不同

         //1.获取session对象

         HttpSession session =request.getSession();

         //2.输出sessionid

         response.getWriter().write("sessionid="+session.getId());

         //演示效果得出,不同浏览器获得的会话对象不同。

     }

思考:服务器是通过什么识别不同的浏览器的呢?

服务器为不同的浏览器创建了不同session对象。服务器是怎么识别不同浏览器?

2.5.  session运行原理

1、当用户第一次访问服务器,服务器运行request.getSession()服务器会创建一个新存储session存储空间,会将session写入到cookie中Cookie cookin=new Cookie(“JSESSIONID”,sessionid);cookie默认有效性为当浏览器关闭时cookie失效。

2、当用户第二次访问服务器,服务器运行request.getSession()时,服务器会获取请求数据中的cookie的JESSIONID,服务器会更具sessionid去服务器内存去找session对象返回,所以第二次访问的sessionid与第一次的session是相等的,没有再次写入cookie。

3、关闭了浏览器,已有的cookie已经过期,服务器无法获取到cookie中的sessionid,所以服务器又创建了新的session对象,产生了新的sessionid。

总结:

         Session技术是依赖或基于cookie技术的

用户第一次访问没有cookie,所以服务器就创建session同时将sessionid写入到cookie

当用户第二次访问时,服务器会通过请求头中去找到cookie-jsessionid,就可以返回已有的session对象。

2.6.  session有效性

 

Session的有效期是在一次会话内,关闭了浏览器session就没用了,但是session对象依然储存在服务器内存中,session对象并没有销毁。

默认的会话时间是 30 分钟(服务器创建一个session对象,30分钟后会销毁这个对象。超过30分钟浏览器没有关闭,浏览器访问服务器,服务器会产生一个新的session对象。)

 

2.7.  如何改变会话销毁时间

方式一(重要):

1). 通过 web.xml 中的配置

<!--配置会话的时间,以分钟为单位-->

<session-config>

<session-timeout>1</session-timeout>

</session-config>

2). session-timeout 的解释:

如果设置为 0 或负数,则会话不过期,但受限于服务器的内存空间。

3). 演示:在 web.xml 中设置会话超时的时间

a. 不设置参数;

b. 将参数的值设置为 1 分

4). 示例:设置 web.xml 的会话配置,并且在代码中设置会话过期的时间,以哪个为准?

就近原理,以代码为准。

注意:一般没有人会去更改session默认30分钟有效期。

3. 方式二:会话立刻失效(最有用)

session.invalidate();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值