Servlet状态管理
前言引入
客户端(浏览器)每发送一次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的存活有效期,单位是分钟,该方法的参数分别作用的范围如下
参数 | 作用 |
---|---|
小于0 | Cookie对象数据保存到内存中 |
大于0 | Cookie对象数据保存到硬盘中 |
等于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);
感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~~