本文共 5692 字,大约阅读时间需要 18 分钟。
其实在我们学习的 web项目中,使用的http协议是无状态的,无连接的。
什么是无状态的呢。也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁。 无连接就是: 每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的 所以需要会话技术识别客户端的状态。会话技术是帮助服务器 记住客户端状态(区分客户端)。关于无状态、无连接的解释参考:
接下来我们了解一下会话技术。
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会 话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session: Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie Session:将数据存储到服务器端,安全性相对好,增加服务器的压力以购物为例,分析Cookie的执行过程:
当在客户端购物时,先将商品(手机)放到购物车,然后服务器将客户端想要购买的东西(手机)设置为cookie,并写到客户端。 当客户端点击结账时,服务器将客户端的cookie值(商品)获取,并结账。 所以,在cookie技术中我们只需要解决两个问题: 第一,服务器端怎样将一个Cookie发送到客户端 第二,服务器端怎样接受客户端携带的Cookiepackage 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可以存多久呢。存在哪里呢。
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。
刚才我们已经说了,第一次访问以后,接下来在站内的任何访问都会带着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值。
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可
//1)通过request获得所有的Cookie:Cookie[] cookies = request.getCookies();//2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookiefor(Cookie cookie : cookies){ if(cookie.getName().equal(cookieName)){ String cookieValue = cookie.getValue();}}
先来看一下session的运行流程:
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID
从上面的图中我们可以发现,了解session主要解决如下三个问题:
怎样获得属于本客户端的session对象(内存区域)? 怎样向session中存取数据(session也是一个域对象)? session对象的生命周期?
HttpSession session = request.getSession();//获取创建新的sessionString id =session.GetId();//获取session的id。
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
session.setAttribute(String name,Object obj); session.getAttribute(String name); session.removeAttribute(String name);创建:第一次执行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对象因为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/