【JavaWeb】会话技术Cookie和Session学习总结

JavaWeb学习小结Cookie和Session

文章目录

  • 1.了解会话
  • 2.Cookie和Session
    • 2.1为什么要用Cookie和Session呢?
    • 2.2 Cookie
      • 2.2.1 怎样操作Cookie
      • 2.2.2 Cookie中存取空格或中文
      • 2.2.3 Cookie常见问题及解决
    • 2.3 Session
      • 2.3.1 理解session机制
      • 2.3.2 怎样操作Session
      • 2.3.3 用户浏览器可能会禁用或者不支持Cookie的情况
  • 3.总结Cookie和Session的关系
  • 4.Cookie和Session的应用

1.了解会话

Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是CookieSessionCookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
    
一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话一样),都视为一次会话,直到浏览器关闭,本次会话结束。其中注意,一个浏览器就相当于一部电话,如果使用火狐浏览器,访问服务器,就是一次会话了,然后打开google浏览器,访问服务器,这是另一个会话,虽然是在同一台电脑,同一个用户在访问,但是,这是两次不同的会话。

2.Cookie和Session

说到CookieSession先从二者的英文单词含义说起,Cookie翻译为中文是小饼干的意思,Session翻译成中文是会话的意思。从翻译就能看出来,Cookie是服务器返回给浏览器的一些断断续续的东西,而Session是一种会话机制。

2.1为什么要用Cookie和Session呢?

  • 因为Http协议是一种无状态协议,服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session而session是如何实现状态保持的呢?
  • 这个时候Cookie作用就体现出来了!
  • 每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session要借助Cookie技术来传递ID属性的.

2.2 Cookie

Cookie是客户端技术,程序把每个用户的数据以Cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。我们通一个图能直观了解Cookie实现原理:
【JavaWeb】会话技术Cookie和Session学习总结_第1张图片
Cookie的内容主要包括:名字,存储数据(值),作用时间(过期时间),作用范围(路径和域),性能。

Cookie 主要内容
定义 Cookie是服务端给客户端的数据,数据存储于客户端(浏览器),即本地,如IE浏览器把Cookie信息保存在类似于C:\windowsCookies的目录下。所以Cookie在客户端可以编辑伪造,并不是十分安全
名字 在创建一个Cookie时,我们给定Cookie
存储数据 只能存储 String 类型的对象(中文或者空格需要转码)
作用时间 Cookie可以通过 setMaxAge()方法,(后面介绍),设置过期时间,如果不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览器会话期的Cookie被称为会话Cookie。会话Cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。
作用范围 Cookie通过设置指定作用域,只能在指定作用域有效。默认Cookie只对当前访问路径所属的目录及其子目录有效。
性能 Cookie存在客户端对服务器没影响

2.2.1 怎样操作Cookie

我们用代码来介绍操作Cookie的API:

//创建一个Cookie
Cookie cookie = new Cookie("mycookie", "first cookie");//左边参数为cookie名,右边参数为cookie值
//取得Cookie的名字
cookie.getName();

//设置Cookie的值
cookie.setValue("rename second cookie");
//取得Cookie的值
cookie.getValue();

//设置Cookie的最大保存时间,不设置cookie的过期时间默认为-1,表示关闭浏览器即结束生命
cookie.setMaxAge(1*60*60*24);//24小时失效,(单位为s)
//获取Cookies的有效期
cookie.getMaxAge();

//设置在某个域名下生效
cookie.setDomain("localhost");//默认为localhost
//获取cookie的有效域
cookie.getDomain();

/*设置cookie的有效路径,
比如把cookie的有效路径设置为"/xdp",
那么浏览器访问"xdp"目录下的web资源时,都会带上cookie,
再比如把cookie的有效路径设置为"/xdp/gacl",
那么浏览器只有在访问"xdp"目录下的"gacl"这个目录里面的web资源时才会带上cookie一起访问,
而当访问"xdp"目录下的web资源时,浏览器是不带cookie的*/
cookie.setPath("/");//默认为 / ,对该站点的所有目录下的访问路径都有效
//获取cookie的有效路径
cookie.getPath();

//删除cookie,注意:删除cookie时,path必须一致,否则不会删除
cookie.setMaxAge(0);//将cookie的有效期设置为0,命令浏览器删除该cookie

//添加到response
response.addCookie(cookie);
//获取cookies
Cookie[] cookies=request.getCookies();
//cookies内的值拿出,通过判断cookie的名字拿到值
//cookie内的值拿出
String lastTime=null;
//不为空则读出来
if (cookies!=null && cookies.length>0){
 for(Cookie cookieNew:cookies){
  String cookieRequestName=cookieNew.getName();
  if ("lastTime".equals(cookieRequestName)){
   lastTime=cookieNew.getValue();
   break;
  }
 }
}

2.2.2 Cookie中存取空格或中文

要想在cookie中存储空格和中文,那么必须使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码。否则会出现异常,报错无法识别。

//设置cookie的内容Value
Strking Value="我打了空格 +中文我";
//进行转码
Value=URLEncoder.encode(Value, "UTF-8");
//创建cookie
Cookie cookie = new Cookie("mycookie",Value);
//发送cookie
response.addCookie(cookie);

在获取Cookie中的中文和空格数据时,再使用URLDecoder类里面的decode(String s, String enc)进行解码。

URLDecoder.decode(cookies.getValue(), "UTF-8");

2.2.3 Cookie常见问题及解决

Cookie常见问题及解决:共享问题cookie.setpath()详解.

2.3 Session

之前我们介绍的Cookie是把用户的身份信息存在了客户端,而Session说白了就是把用户的信息(状态)保存在了服务端。

2.3.1 理解session机制

  • 原理图
    【JavaWeb】会话技术Cookie和Session学习总结_第2张图片

  • Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。

  • 当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识称为Session ID,如果已包含一个Session ID则说明以前已经为此客户端创建过Session

  • 服务器就按照Session ID把这个Session检索出来使用,如果客户端请求不包含Session ID,则为此客户端创建一个Session并且生成一个与此Session相关联的Session ID,它的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session ID将被在本次响应中返回给客户端保存。 保存这个Session ID的方式可以采用Cookie,这样在会话过程中客户端(浏览器)可以自动的按照规则把这个Session ID发送给服务器。

  • 所以当客户端(浏览器)关闭,就再也访问不到之前的Session ID了,Session要借助Cookie技术来传递ID属性的,但是还可以访问之前创建的Session

Session的主要内容:存储数据(值),作用时间(过期时间),作用范围(路径和域),性能

Session 主要内容
定义 Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的Session对象,由于Session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的Session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的Session中取出数据为用户服务。
存储数据 能够存储任意的 java 对象
作用时间 由于Session是保存在了服务端,所以当用户关闭浏览器时Session并不会消失。一般Session保存在服务器的内存中,当然也可以持久化到硬盘或者数据库中。Session的默认过期时间是30分钟,过期的Session会被服务器自动的销毁。注意如果大量的创建Session可能导致服务器的内存溢出。
作用范围 Session在整个网页都有效
性能 Session过多时会消耗服务器资源,大型网站会有专门Session服务器

2.3.2 怎样操作Session

我们用代码来介绍Session常用方法:

//获取session,没有则创建
HttpSession session = request.getSession();
 
//获取SessionId
session.getId()
 
//获取存储的某个值
session.getAttribute("key");
 
//存储数据,value是object类型
session.setAttribute("key","value");
 
//设置会话的过期时间(单位:秒),默认30分钟
session.setMaxInactiveInterval(1*60*60);
 
//获取session创建的时间
session.getCreationTime();
 
//获取最后一次修改session的时间
session.getLastAccessedTime()
 
//移除某个数据
session.removeAttribute("key");
 
//重置session,使session失效
session.invalidate();

2.3.3 用户浏览器可能会禁用或者不支持Cookie的情况

当浏览器不支持Cookie或者关闭了Cookie 功能时,在会话过程中,如果想 让Web服务器可以保存用户的信息,必须对所有可能被客户端访问的请求路径进 行URL重写。在HttpServletResponse接口中,定义了两个用于完成URL重写的方法。

response.encodeRedirectURL(java.lang.String url) //用于对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url)    //用于对表单action和超链接的url地址进行重写

URL重写,指的是将Session的会话标识号以参数 的形式附加在超链接的URL地址后面。对于Tomcat服务器来说,就是将JSessionID关键字作为参数名以及会话标识号的值作为参数值附加到URL地址 后面。具体使用:

public class IndexServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        //创建Session
        request.getSession();
        out.write("本网站有如下书:
"
); Set<Map.Entry<String,Book>> set = DB.getAll().entrySet(); for(Map.Entry<String,Book> me : set){ Book book = me.getValue(); String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId(); //response. encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写 newurl = response.encodeURL(url);//将超链接的url地址进行重写 out.println(book.getName() + " 购买
"
); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

当浏览器禁用了Cookie后,就可以用URL重写这种解决方案解决Session数据共享问题。而且response. encodeRedirectURL(java.lang.String url)和response. encodeURL(java.lang.String url)是两个非常智能的方法,当检测到浏览器没有禁用Cookie时,那么就不进行URL重写了。

3.总结Cookie和Session的关系

  1. Cookie是服务端给客户端的数据,客户端保存用户信息的一种机制,存在于客户端。
  2. Session是在服务端保存的一个数据结构,会响应给Cookie一个Session ID的记录,它是基于Cookie的一种机制。
  3. Session通过服务器向浏览器发送一个具有SessionId的会话Cookie来给用户一个身份标识,在浏览器没有关闭的情况下,会话CookieSessionid)一直存在,服务器中Session的数据也一直存在。一旦浏览器关闭,浏览器的会话CookieSessionid)会消亡,但服务器中的Session仍然存在,只有消亡倒计时结束或者调用了Session.invalidate();服务器中的Session才会消亡。
  4. Cookie的安全性不高,存储在本地,总存储量也只有4kb,浏览器会限制最多Cookie数,可能禁用Cookie
  5. Session的安全性较高,总存储量很高,由于数据存储在服务器中,无需加密,但对一个网页来说具有唯一性。

4.Cookie和Session的应用

Cookie和Session简单应用情景.

欢迎点赞评论,指出不足,笔者由衷感谢哦!~

你可能感兴趣的:(JavaWeb开发,session,cookie,java,http)