Cookie与Session机制

前言引入

        客户端(浏览器)每发送一次HTTP请求,都会重新构建request(HttpServletRequest)与response(HttpServletResponse)对象,一旦进行重建,之前使用request(HttpServletRequest)和response(HttpServletResponse)绑定的数据就会丢失,因此称HTTP协议成为 “无状态” 协议,而往往我们需要对一些相关数据进行存储。servlet状态管理主要是对用户的相关数据进行存储过程。通过两种方式实现:Cookie与Seesion的方式

Cookie机制

什么是Cookie?

        浏览器(客户端)在访问服务器的时候,它会将部分信息以set-cookie消息头的方式保存在本地(内存、磁盘)。当浏览器再次访问的时候,会将这些数据以cookie消息头的方式发送给浏览器

构建与添加Cookie

        创建Cookie对象需要传递两个参数,主要存储形式类似于Map集合中的<K,V>的形式进行存储,案例代码如下

@WebServlet("/addCookie")
public class AddCookieServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        //设置请求request对象中数据的编码方式
        request.setCharacterEncoding("utf-8");
        //设置响应的数据类型与编码方式
        response.setContentType("text/html;charset=utf-8");
        //1、构建Cookie对象
        Cookie c1 = new Cookie("username", "Lucky");
        Cookie c2 = new Cookie("password","123456");
        //2、添加Cookie
        response.addCookie(c1);
        response.addCookie(c2);
        //3、通过输出流的方式向网页中写入内容
        response.getWriter().println("<h1>cookie已经添加成功...</h1>");
    }
}

        存储在浏览器的结果显示
在这里插入图片描述

什么是会话

        会话过程就是指从打开浏览器开始到关闭浏览器的整个过程

Cookie的有效期

为什么设置Cookie有效期

        在这里我就给大看一下password对应的Cookie存活时间,可以发现到期时间是会发结束时,也就是只要浏览器关闭,那么当前Cookie对象存储的数据将会丢失。由此可以得知Cookie是保存在本地浏览器的,默认随着浏览器关闭而关闭(存储在内存),但在实际业中有时候需要一些数据保存的时间长一些,该如何设置呢?
在这里插入图片描述

通过什么方法设置Cookie的有效期

        我们使用Cookie对象中的setMaxAge(int expiry) 方法可以设置Cookie的存活有效期单位是分钟,该方法的参数分别作用的范围如下

参数作用
小于0Cookie对象数据保存到内存中
大于0Cookie对象数据保存到硬盘中
等于0删除Cookie(其实是刚添加进去,就到期了,从而达到了移除Cookie的效果)

        案例代码与效果图如下

@WebServlet("/addCookie")
public class AddCookieServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        //设置请求request对象中数据的编码方式
        request.setCharacterEncoding("utf-8");
        //设置响应的数据类型与编码方式
        response.setContentType("text/html;charset=utf-8");
        //1、构建Cookie对象
        Cookie c1 = new Cookie("username", "Lucky");
        Cookie c2 = new Cookie("password","123456");
        //2、设定Cookie的有效期:1小时
        c1.setMaxAge(60*60);
        c2.setMaxAge(60*60);
        //3、添加Cookie
        response.addCookie(c1);
        response.addCookie(c2);
        //4、通过输出流的方式向网页中写入内容
        response.getWriter().println("<h1>cookie已经添加成功...</h1>");
    }
}

在这里插入图片描述
        由上面的Cookie到期时间可以看出存活时间为 1 小时

Cookie的路径

        我们有时候在特定的场合下需要对Cookie保存的路径进行相关的设置,设置Cookie存储路径可以通过Cookie对象中的setPath(String uri) 方法设置,只需要传入存储的路径即可

Cookie存储中文乱码问题

        当我们在构建Cookie对象存储的值为中文时会出现乱码问题。由于中文采用的Unicode字符集的方式,存储时采用的是十六进制的方式进行存储的。若采用中文将会有对应的错误信息:HTTP Status 500 - Control character in cookie value or attribute.。那么该如何解决呢?
        构建Cookie对象时,我们的字符串可以使用编码库对我们的字符串进行编码的设定,从而避免这种错误信息的发生,通过URLEncoder调用即可。若要对字符串进行解码操作可以通过URLDecoder.decode(String s,String enc)方法进行解码,从而得到对应的字符序列

//通过编码库对我们存储的字符串进行编码操作
Cookie c1 = new Cookie("username", URLEncoder.encode("上进的小仓鼠","utf-8"));

Cookie数据的安全问题

        由于HTTP协议是一种 “无状态” 协议,通过HttP请求的数据不安全很容易被人进行截取。因此我们可以通过Cookie对象中的setSecure(boolean falg) 方法传入 true 进行设置,使用此方法进行设定后只能够在HTTPS与SSL等加密协议下进行数据的交互,但是该方式并不能对存储数据进行加密操作,还是会存在安全隐患,所以对Cookie存储的数据使用md5等加密手段进行加密操作才是安全的根本问题

Session机制

什么是Session

        浏览器在访问服务器的时候,服务器会先创建一个Session对象(存储在内存中)并为该对象分配一个唯一的JSESSIONID,服务器会以Cookie的消息头方式将JSESSIONID存储到本地浏览器,而同时服务器也有这个JSESSIONID,当浏览器下一次访问的时候,会按照这个JSESSIONID去服务器进行匹配,从而保证存储状态,Session存储流程图如下
在这里插入图片描述

如何获取Session对象

        我们可以通过HttpServletRequest对象获取HttpSession对象,从而通过setAttribute() 方式进行数据的存储

@WebServlet("/addSession")
public class CountsServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException{
        //设置请求request对象中数据的编码方式
        request.setCharacterEncoding("utf-8");
        //设置响应的数据类型与编码方式
        response.setContentType("text/html;charset=utf-8");
        //获取session
        HttpSession session = request.getSession();
        //绑定数据
        session.setAttribute("count",count);
        response.getWriter().println("session成功绑定数据......");
    }
}

Session常用方法

方法名称作用
setAttribute(String s,Object o)绑定数据到Session
getAttribute(String s,Object o)获取Session中绑定的数据
String getId()获取JSEONID的值
removeAttribute(String s);移除Session绑定的数据

Session的有效期

        当我们的浏览器关闭以后Session就失效了,原因是Session对象将JSESSIONID存储到了本地浏览器中,并且是以Cookie消息头的方式进行存储,而Cookie默认的存活的有效期为-1,即存储在内存中,会随着浏览器关闭而消失。因此设置JSESSIONID的超时时间可以调用Session对象中的setMaxInactiveInterval()方法进行设定,案例代码如下

	//获取session
	 HttpSession session = request.getSession();
     //设置sesson的存活时间:单位  天
     session.setMaxInactiveInterval(30);

感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~~

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被风吹过的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值