Java Cookie和Session

*/

.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}

.hljs-comment,
.hljs-template_comment,
.diff .hljs-header,
.hljs-javadoc {
color: #998;
font-style: italic;
}

.hljs-keyword,
.css .rule .hljs-keyword,
.hljs-winutils,
.javascript .hljs-title,
.nginx .hljs-title,
.hljs-subst,
.hljs-request,
.hljs-status {
color: #333;
font-weight: bold;
}

.hljs-number,
.hljs-hexcolor,
.ruby .hljs-constant {
color: #099;
}

.hljs-string,
.hljs-tag .hljs-value,
.hljs-phpdoc,
.tex .hljs-formula {
color: #d14;
}

.hljs-title,
.hljs-id,
.coffeescript .hljs-params,
.scss .hljs-preprocessor {
color: #900;
font-weight: bold;
}

.javascript .hljs-title,
.lisp .hljs-title,
.clojure .hljs-title,
.hljs-subst {
font-weight: normal;
}

.hljs-class .hljs-title,
.haskell .hljs-type,
.vhdl .hljs-literal,
.tex .hljs-command {
color: #458;
font-weight: bold;
}

.hljs-tag,
.hljs-tag .hljs-title,
.hljs-rules .hljs-property,
.django .hljs-tag .hljs-keyword {
color: #000080;
font-weight: normal;
}

.hljs-attribute,
.hljs-variable,
.lisp .hljs-body {
color: #008080;
}

.hljs-regexp {
color: #009926;
}

.hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.lisp .hljs-keyword,
.tex .hljs-special,
.hljs-prompt {
color: #990073;
}

.hljs-built_in,
.lisp .hljs-title,
.clojure .hljs-built_in {
color: #0086b3;
}

.hljs-preprocessor,
.hljs-pragma,
.hljs-pi,
.hljs-doctype,
.hljs-shebang,
.hljs-cdata {
color: #999;
font-weight: bold;
}

.hljs-deletion {
background: #fdd;
}

.hljs-addition {
background: #dfd;
}

.diff .hljs-change {
background: #0086b3;
}

.hljs-chunk {
color: #aaa;
}

#container {
padding: 15px;
}
pre {
border: 1px solid #ccc;
border-radius: 4px;
display: block;
background-color: #f8f8f8;
}
pre code {
white-space: pre-wrap;
}
.hljs,
code {
font-family: Monaco, Menlo, Consolas, ‘Courier New‘, monospace;
}
:not(pre) > code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
background-color: #f9f2f4;
white-space: nowrap;
border-radius: 4px;
}
-->

1.会话技术简介

http协议是无状态的,因此对于服务端来说,当它接收到客户端的http请求时,无法识别这个请求来源于哪个客户端。无状态的协议有优点也有缺点,但对于需要识别客户端甚至是需要记住客户端的业务来说,应当要让http协议"有状态"。

需要记住客户端的业务种类非常多。例如登陆系统,在一个页面登录后,新打开一个该网站页面,应当也保持登录状态。再例如购物车系统,某用户添加商品1后应当保证他还能继续添加商品2,在结算时能够读取购物车中的所有商品。

如何让服务端记住客户端?目前使用最多的是cookie和session两种会话技术。

  • 1.Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie。
  • 2.Session:将数据存储到服务器端,安全性相对好,会增加服务器的压力。

2.Cookie技术

Cookie技术是将用户的数据存储到客户端的技术,它的作用是为了让服务端根据每个客户端持有的cookie来区分不同客户端。

cookie由cookie name、具有唯一性的cookie value以及一些属性(path、expires、domain等)构成,其中value是区分客户端的唯一依据。

Cookie的原理为:服务端在接收到客户端首次发送的请求后,服务端在响应首部中加入"set-cookie"字段发送给客户端;客户端接收响应后,将cookie信息存储到内存中(如果设置了MaxAge属性,则存储到磁盘中);因为cookie数据在浏览器的内存中,因此无论是哪个页面,客户端再次向服务端发送请求时都能获取该cookie信息,并在请求首部中加入"cookie"字段发送给服务端;服务端借此就可以识别客户端,并从cookie中找到该客户端的信息。

使用Cookie需要解决的两个问题:

  • (1).服务端怎样将一个Cookie发送到客户端。
  • (2).服务端怎样接受客户端携带的Cookie。

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

设置Cookie涉及的几个常用方法为:

  • Cookie(String cookie_name,String cookie_value):构造一个Cookie对象。
  • setPath(uri):当访问属于该uri下的路径(包括子路径)时,该cookie都生效,例如setPath("/Cookie"),当本机使用http://localhost/Cookie/servlet1http://localhost/Cookie/servlet2访问时,都拥有该Cookie。
  • setMaxAge(int second):设置该属性时,cookie将持久化保存到客户端的磁盘中,保存时间为second秒。如果cookie不具有该属性,则cookie只会存放在内存中。
  • setDomain(String domain):设置Cookie生效的域范围,例如cookie.setDomain(".foo.com");,这将对foo.com域下的所有主机都生效(如www.foo.com),但不包括子域(www.abc.foo.com)。

设置好Cookie后,需要使用response的方法addCookie(Cookie cookie)将cookie加入到响应首部中发送给客户端。

例如,以下是名为CooikeDemo工程的一个servlet,该servlet的uri路径为"/cookieservlet"。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("username","zhangsan");  //构造cookie对象
        cookie.setPath("/CookieDemo");       //设置cookie生效的uri范围
        cookie.setMaxAge(10*60);             //设置cookie持久到磁盘的时间为10分钟
        response.addCookie(cookie);          //在响应首部中加入set-cookie字段并发送给客户端
    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

该cookie将会在响应首部加入set-cookie字段发送给客户端:

当客户端再次请求时,将在请求首部中加入cookie字段。

需要注意的几点:

  • (1).Cookie中不能存储中文。
  • (2).如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭时cookie信息销毁,这是会话级的cookie。如果设置持久化时间,cookie信息会被持久化到磁盘中,这是持久级别的cookie。持久化后的cookie不会随浏览器关闭而失效,而是在有效时间内都有效。
  • (3).setPath()设置的生效路径为目录时,则cookie对该目录和子目录下的资源都生效,如果生效路径为文件时,则只对该文件有效。例如:
    cookie.setPath("/webapp");  //代表访问webapp应用中的任何资源都携带cookie
    cookie.setPath("/webapp/cookieservlet");  //代表访问webapp中的cookieservlet时才携带cookie信息
    
  • (4).如果想要删除当前还有效的cookie信息,可以使用同名同路径的持久化时间为0的cookie进行覆盖。这样一来,每次客户端接收到响应后cookie就立即失效,也就无法携带cookie请求服务端。例如删除上面示例的cookie信息
    Cookie cookie = new Cookie("username","zhangsan");
    cookie.setPath("/CookieDemo");
    cookie.setMaxAge(0);
    response.addCookie(cookie);
    

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

如前面的图中所示,客户端的cookie信息是以请求头的方式发送到服务器端的。因此服务端要获取cookie信息,需要使用request对象中的方法getCookies()。这时唯一的获取cookie的方法,它返回的是Cookie数组集合,因此需要遍历该数组才能获取指定名称的cookie。

例如,获取cookie name为"username"的cookie。

Cookie[] cookies = request.getCookies();
if(cookies != null) {
    for (Cookie coo : cookies) {
        String cookie_name = coo.getName();
        if (cookie_name.equals("username")) {
            String cookie_value = coo.getValue();
            System.out.println(cookie_name+":"+cookie_value);
        }
    }
}

3.Session技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程(释放浏览器内存),成为一次会话。除了Cookie技术可以让服务端在一次会话过程中记住客户端,Session技术也可以达到这样的目的。

Session技术将数据存储在服务器端,它会为每个客户端都创建一块内存空间存储客户端数据,并为客户端分配一个存储在cookie中的JSESSIONID,客户端需要每次都携带一个这个ID,服务器通过这个ID可以找到属于该客户端的内存空间。由于这个标识ID是借助Cookie存储的唯一性标识JSESSIONID,因此Session是基于Cookie来实现的。

Session的原理:服务端接收到某客户端首次发送的请求后,为此客户端生成一个session,并分配一段属于该session的缓冲区,同时将该session配对的标识号JSESSIONID作为cookie的name添加到响应首部中返回给客户端;客户端下次访问时,请求首部中将携带该JSESSIONID,服务端将根据该JSESSIONID寻找与之配对的session,如果能找到对应的session,则直接操作该session资源,否则将重新为此JSESSIONID分配一个session和对应的缓冲区。

使用Session技术需要解决如下三个问题:

  • (1).怎样获得属于某客户端的session对象(内存区域)?
  • (2).怎样向session中存取数据?
  • (3).session对象的生命周期?

3.1 获得Session对象

服务端通过客户端发送cookie中的JSESSIONID区分客户端,可以通过请求包中的这个信息来获取该客户端相关的session信息。

HttpSession session = request.getSession();

此方法有两个作用:

  • (1).从cookie中获取JSESSIONID,并寻找是否存在该ID对应的session对象。如果存在,则获取该session对象。
  • (2).如果该客户端没有发送JSESSIONID或JSESSIONID和服务端记录的ID值不匹配,则为该JSESSIONID重新分配一个session对象。

实际上就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了,有则用之,无则分配之。

3.2 向session中存取数据(session也是一个域对象)

session也是一个域对象,session域的作用范围是整个session,可以对客户端的多次请求生效。该范围小于context域(即application域),大于request域(只在一次请求内有效)。

作为域对象,session对象也同样具有如下三个方法:

session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);

此外,可以通过session对象的getId()方法获取到该session的JSESSIONID值。

3.3 Session对象的生命周期

  • 创建:第一次执行request.getSession()时创建。
  • 销毁:
    • 1.服务器(非正常)关闭时。
    • 2.session过期/失效(默认30分钟,这个默认时间可以在web.xml中修改)。
      <session-config>
        <session-timeout>30</session-timeout>
      </session-config>
      

      需要注意的是失效时间的起算点,即从何时开始计算30分钟?从不操作服务器端的资源开始计时(即从最近一次读取session数据开始)。

    • 3.手动销毁session:session.invalidate();

也就是说,客户端在一次会话中任何资源都共用一个session对象。

问题:浏览器关闭,session就销毁了吗?
不对,session存储在服务端,和客户端没多大关系,只要客户端没有操作session,等一段时间后,session自动销毁。
但是,关闭浏览器后,cookie中的JSESSIONID就丢失了,也就无法再找到对应的session数据。可以在发送session给客户端前将jsessionid当成cookie的属性并配置cookie的持久化时间持久化到客户端磁盘,这样再次打开浏览器时jsessionid就不会丢失。代码大致如下:

HttpSession session = request.getSession();
session.setAttribute("username","Tom");
String id = session.getId();                  //获取JSESSIONID值
Cookie cookie = new Cookie("JSESSIONID",id);  //"JSESSIONID"为固定值
cookie.setPath("/CookieDemo");
cookie.setMaxAge(12*60*60);   //JSESSIONID持久化保存12小时
response.addCookie(cookie);

response.getWriter().write("JSESSIONID:"+id);
System.out.println(session.getAttribute("username"));

注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

原文地址:https://www.cnblogs.com/f-ck-need-u/p/8322445.html

时间: 2024-10-09 19:42:24

Java Cookie和Session的相关文章

Java——Cookie与Session

Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie.客户端浏览器会把Cookie保存起来,当浏览器再请求该网站时,把请求的网址连同该Cookie一同交给服务器.服务器检查该Cookie,以此来辨认用户状态.服务器还可以根据需要修改Cookie的内容. java中把Cook

Java web基础总结六之—— Cookie与Session

Java web基础总结六之-- Cookie与Session 当我们在使用浏览器与服务器进行会话的过程中,就必然会产生一些数据.这个时候就需要对数据进行保存.比如常见的购物网站购物车信息的保存.保存客户端与服务器会话数据的两种技术是Cookie与Session. 一.Cookie 1.什么是Cookie? Cookie是保存在客户端的,以name,value的形式保存.当用户使用浏览器访问服务器产生数据时,服务器程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去

cookie、session和java过滤器

基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一定的作用.之所以把这三个放一起,是因为有很多时候都会是把他们结合在一起使用,例如有些登陆程序. cookie是浏览器的机制,session是服务器的机制,但是实际上cookie也是由服务器生成的,之后返回给浏览器的,并不是浏览器本身生成.当浏览器发送某个请求时,如果拥有有效的cookie则会把这个c

2014-07-09 Java Web的学习(5)-----会话管理(Cookie和Session)

1.什么是会话 会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待会话,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器访问一个电子商务网站,登录.并完成购物直到关闭浏览器,这是一个会话.而在web应用的开发者开来,用户登录时我需要创建一个数据结构以存储用户的登录信息,这个结构也叫做会话.因此在谈论会话的时候要注意上下文环境.而本文谈论的是一种基于HTTP协议的用以增强web应用能力的机制或者说一种方案,它不是单指某种特定的动态页面技术,而这种能力就是保

Java Web(三) 会话机制,Cookie和Session详解

一.会话机制 Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择.具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所

Java开发系列-Cookie与Session会话技术

概述 会话技术:当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话.会话技术产生是由于Http请求是一个无状态的协议,它不会记录上次访问的内容,用户在访过程中难免产生一些数据,通过会话技术可以将其保存起来.常见的会话技术cookie.Session. Cookie Cookie称之为浏览器端的会话技术. Cookie是由服务端生成,通过response将cookie写会浏览区(set-cookie),保留在浏览器上,下一次访问,浏览器根据一定的规则携带不同的Coo

Java web 会话技术 cookie与session

一.会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据. 二.保存会话数据的两种技术 1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是

Java Web 开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式.Cookie存储的数据量有限,且都是保存在客户端浏览器中.不同的浏览器有不同的存储大小,但一般不超过4KB.因此使用 实际上只能存储一小段的文本信息. 例如:登录网站,今输入用户名密码登录了,第二天再打开很多情

JAVA基础之会话技术-Cookie及Session

至此,学习三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会话,直至关闭浏览器为止结束.在此过程中,每次产生请求时均会产生一次cookie,同时会产生一个JESSIONID进入到客户端进行创建内存空间,下次调用直接寻找此唯一的ID值.数据存储在两个地方均有利弊!需要注意的是,浏览器关闭,session并没有销毁! 一.会话技术简介: 1.存储客户端的状态: 因为Http协