博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java】会话技术Cookie&Session
阅读量:2240 次
发布时间:2019-05-09

本文共 5692 字,大约阅读时间需要 18 分钟。

文章目录

一、背景:

其实在我们学习的 web项目中,使用的http协议是无状态的,无连接的。

什么是无状态的呢。也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁
无连接就是: 每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的
所以需要会话技术识别客户端的状态。会话技术是帮助服务器 记住客户端状态(区分客户端)。

关于无状态、无连接的解释参考:

接下来我们了解一下会话技术。

二、会话技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会 话技术就是记录这次会话中客户端的状态与数据的。

会话技术分为Cookie和Session:
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力

1、Cookie

以购物为例,分析Cookie的执行过程:

在这里插入图片描述
当在客户端购物时,先将商品(手机)放到购物车,然后服务器将客户端想要购买的东西(手机)设置为cookie,并写到客户端。
当客户端点击结账时,服务器将客户端的cookie值(商品)获取,并结账。
所以,在cookie技术中我们只需要解决两个问题:
第一,服务器端怎样将一个Cookie发送到客户端
第二,服务器端怎样接受客户端携带的Cookie

1.1 服务器端怎样将一个Cookie发送到客户端

package it.cookie;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;/** * Servlet implementation class CookieServlet */public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建cookie对象 Cookie cookie=new Cookie("name","cjp"); //2、将cookie对象发送到客户端——通过响应头。 response.addCookie(cookie); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

发布后,第一次访问:我们用filter抓包:

在这里插入图片描述
此时我们发现,在request中没有cookie对象的值。仅仅在response中有set-cookie:name=cjp
我们再次刷新连接,继续抓包:
在这里插入图片描述
此时我们发现在response和request中均有cookie对象的值。

注意:Cookie中不能存储中文

第一次写入cookie后,我们再请求本应用网址下的任何资源,均会在request中附带cookie值,除非清空cookie值。

那问题来了,我们cookie可以存多久呢。存在哪里呢。

1.1.1设置Cookie在客户端的持久化时间:

cookie.setMaxAge(int seconds); —时间秒

注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(这是会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里

package it.cookie;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;/** * Servlet implementation class CookieServlet */public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建cookie对象 Cookie cookie=new Cookie("name","cjp"); //1.1 为cookie设置持久化时间——cookie在硬盘保存的时间。 cookie.setMaxAge(60*10);//10分钟 //cookie.setMaxAge(0);//表示删除cookie //2、将cookie对象发送到客户端——通过响应头。 response.addCookie(cookie); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

在这里插入图片描述

抓包后我们发现在cookie值后面多了一句话。Max-Age=600; Expires=Wed, 02-Jan-2019 08:50:49 GMT。只要这个时间一过,浏览器自动销毁cookie。

1.1.2设置Cookie携带的路径:

刚才我们已经说了,第一次访问以后,接下来在站内的任何访问都会带着cookie值请求,但是这样有一个问题,如果cookie量特别大的时候,影响传输速率。为此我们需要设置那些路径携带cookie,那些路径不用携带。

cookie.setPath(String path);

注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的 web资源所在的路径都携带cookie信息

示例:

1、cookie.setPath("/CookieAndSession");代表访问CookieAndSession应用中的任何资源都携带cookie
2、cookie.setPath("/CookieAndSession/CookieServlet");代表访问CookieAndSession中的CookieServlet时才携带cookie信息
3、cookie.setpath("/");访问服务器下的所有资源都带cookie。
4、如果不设置携带路径,那么第一次访问http://localhost:8080/CookieAndSession/demo/CookieServlet路径;而第二次访问http://localhost:8080/CookieAndSession/CookieServlet路径时,request中是 不带cookie值的。仅仅在访问http://localhost:8080/CookieAndSession/demo路径下的所有服务时才携带第一次访问http://localhost:8080/CookieAndSession/demo/CookieServlet时产生的cookie值。

1.1.3删除客户端的cookie:

如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

1.2 服务器端怎样接受客户端携带的Cookie

//1)通过request获得所有的Cookie:Cookie[] cookies = request.getCookies();//2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookiefor(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();}}

2、Session

先来看一下session的运行流程:

在这里插入图片描述

1)Session技术简介

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID

从上面的图中我们可以发现,了解session主要解决如下三个问题:

怎样获得属于本客户端的session对象(内存区域)?
怎样向session中存取数据(session也是一个域对象)?
session对象的生命周期?

2).获得Session对象

HttpSession session = request.getSession();//获取创建新的sessionString id =session.GetId();//获取session的id。

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)

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

Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

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

4)Session对象的生命周期(重点)

创建:第一次执行request.getSession()时创建

销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)

问题:时间的起算点 从何时开始计算30分钟?

从不操作服务器端的资源开始计时

可以在tomcat 的文件夹conf中的web.xml中进行配置

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

3)手动销毁session

session.invalidate();

作用范围:

默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象

5)jsessionid的持久化问题

因为jsessionid是借助cookie来存储的,那么就设计到一个持久化的问题.

//1、创建cookie对象		Cookie cookie=new Cookie("jsessionid",jsessionid);		//1.1 为cookie设置持久化时间——cookie在硬盘保存的时间。		cookie.setMaxAge(60*10);//10分钟 		cookie.setPath("/项目路径/");		//2、将cookie对象发送到客户端——通过响应头。		response.addCookie(cookie);

转载地址:http://vxhbb.baihongyu.com/

你可能感兴趣的文章
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>