【JavaWeb】Servlet的应用全面讲解(三)cookie和session
2023-09-11 14:18:28 时间
【JavaWeb】Servlet的应用全面讲解(三)cookie和session
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
一、Cookie
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
(一)cookie的创建和发送
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//cookie的创建
Cookie cookie = new Cookie("name","admin");
//发送(响应) Cookie对象
resp.addCookie(cookie);
}
(二)cookie的获取
将会返回一个cookie数组,供获取cookie数据
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie数组
Cookie[] cookies = req.getCookies();
//判断cookie是否为空
if(cookies != null && cookies.length>0){
//遍历cookie数组
for (Cookie cookie : cookies){
//获取cookue的名称和值
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("名称:"+name+" 值:"+value);
}
}
}
(三)cookie的到期时间
1. 到期时间的表示
/**
* cookie的到期时间
* 负整数
* 默认值-1,表示只在浏览器内存中存活,关闭浏览器失效
* 正整数
* 表示存活时间,单位秒
* 零
* 删除cookie
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*到期时间:负整数(默认值-1,表示只在浏览器内存中存活,关闭浏览器失效)*/
Cookie cookie = new Cookie("uname1","zhangsan");
cookie.setMaxAge(-1); //关闭浏览器失效
resp.addCookie(cookie);
/*到期时间:正整数(表示存活指定秒数,会将数据存在磁盘中)*/
Cookie cookie2 = new Cookie("uname2","lisi");
cookie.setMaxAge(30); //存活30s
resp.addCookie(cookie2);
/*到期时间:零 (表示删除cookie)*/
Cookie cookie3 = new Cookie("uname3","wangwu");
cookie.setMaxAge(0); //删除cookie
resp.addCookie(cookie3);
}
(四)cookie中文乱码问题、以及如何重新设置
1. 说明
/**
* cookie的注意点
* 1. Cookie只在当前浏览器有效(不跨浏览器和主机)
* 2. Cookie不能存中文
* 如果一定要存中文,则需要URLEncoder.encode()方法进行编码。获取时通过URLDecoder.decode()方法进行解码
*
* 3.如果出现同名的Cookie对象,则会覆盖
* 4.Cookie的存储数量是有上限,不同浏览器不同。Cookie储存的大小也是有限的,大概4kb
*
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*Cookie存中文*/
String name = "姓名";
String value = "张三";
//将中文通过URLEncoder进行编码
name = URLEncoder.encode(name);
value = URLEncoder.encode(value);
//创建Cookie对象
Cookie cookie = new Cookie(name,value);
//响应Cookie
resp.addCookie(cookie);
//获取Cookie时,通过URLDecoder进行解码
Cookie[] cookies = req.getCookies();
//判断非空
if(cookies != null&& cookies.length>0){
//遍历
for(Cookie cook : cookies){
//解码
System.out.println(URLDecoder.decode(cook.getName()));
System.out.println(URLDecoder.decode(cook.getValue()));
}
}
//将原来已有的Cookie对象重新设置
Cookie cookie2 = new Cookie("name","zhangsan");
resp.addCookie(cookie2);
}
(五)指定路径获取cookie
1. 说明
/**
* cookie的路径
* 1. 当前服务器下的任何项目的任意资源都可以获取Cookie对象
* 设置路径为“/”,表示在当前服务器下任何项目都可访问到Cookie对象
* 2. 当前项目下的资源都可以获取Cookie对象 (默认不设置Cookie的path)
* 默认不设置Cookie的path 或者 设置为当前站点名
* 3. 指定项目下的资源都可以获取Cookie对象
* 4. 指定目录下的资源都可以获取Cookie对象
*
* 总结:只有访问的路径中包含Cookie对象的Path值,才有以获取到该cookie对象
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*当前服务器下的任何项目的任意资源都可以获取Cookie对象*/
Cookie cookie01 = new Cookie("cookie01","cookie01");
//设置路径为“/”,表示在当前服务器下任何项目都可访问到Cookie对象
cookie01.setPath("/");
resp.addCookie(cookie01);
/*当前项目下的资源都可以获取Cookie对象 (默认不设置Cookie的path)*/
Cookie cookie02 = new Cookie("cookie02","cookie02");
//默认不设置Cookie的path 或者 设置为当前站点名
cookie01.setPath("/servlet");
resp.addCookie(cookie02);
/*指定项目下的资源都可以获取Cookie对象 */
Cookie cookie03 = new Cookie("cookie03","cookie03");
//设置为指定项目的站点名
cookie01.setPath("/指定站点名");
resp.addCookie(cookie03);
/*指定目录下的资源都可以获取Cookie对象 */
Cookie cookie04 = new Cookie("cookie04","cookie04");
//设置为指定项目的站点名
cookie01.setPath("/servlet/cookie04");
resp.addCookie(cookie04);
}
二、Session
在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
(一)session对象的获取和访问
1. 说明
/**
* Session对象的获取
* session对象的获取
* req.getSession()
* 当获取session对象时,会先判断session对象是否存在。若存在,则获取,反之,则创建。
* 常用方法
* 获取session的会话标识符 getId()
* 获取session的创建时间 getCreationTime()
* 获取最后一次访问时间 getLastAccessedTime()
* 判断是否是新的session对象 isNew()
*/
2.代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session对象
HttpSession session = req.getSession();
//获取session的会话标识符
String id = session.getId();
System.out.println(id);
//获取session的创建时间
System.out.println(session.getCreationTime());
//获取最后一次访问时间
System.out.println(session.getLastAccessedTime());
//判断是否是新的session对象
System.out.println(session.isNew());
}
(二)session域对象的应用
1. 说明
/**
* Session域对象
* setAttribute() 设置域对象
* getAttribute() 获取域对象
* removeAttribute() 移除域对象
*
* 请求转发
* 一次请求
* request作用域有效
* session作用域有效
* 重定向
* · 两次请求
* request作用域无效
* session作用域有效
*/
2. 代码演示
重定向时,session域依旧能够共享
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session对象
HttpSession session = req.getSession();
//设置域对象
session.setAttribute("uname", "admin");
session.setAttribute("upwd", "123456");
//移除session域对象
session.removeAttribute("upwd");
/*request域对象*/
req.setAttribute("name","zhangsan");
//请求转发跳转到jsp页面
//req.getRequestDispatcher("sessionTest.jsp").forward(req,resp);
//重定向跳转到jsp页面
resp.sendRedirect("sessionTest.jsp");
}
jsp页面获取session域对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取域对象</title>
</head>
<body>
<%
//获取session域对象
String uname = (String) request.getSession().getAttribute("uname");
String upwd = (String) request.getSession().getAttribute("upwd");
//获取request域对象
String name = (String) request.getAttribute("name");
out.print("uname :"+ uname + ",upwd :"+ upwd +",name :" +name);
%>
</body>
</html>
session对象的过期和销毁
1. 说明
/**
* Session对象的销毁
* 1. 默认到期时间
* Tomcat 中的session默认存活时间为30min,即你无操作的时间。一旦有操作,session存活时间将重计
* 可以在 Tomcat 中的 conf 目录下的 web.xml 文件中进行修改
*
* <!-- session 默认的最大不存活时间。单位:分钟 -->
* <session-config>
* <session-timeout>30</session-timeout>
* </session-config>
*
* 2. 手动设置到期时间
* 通过session.setMaxInactiveInterval(int)来设定session的最大不活动时间,单位为秒
* 并且可以通过getMaxInactiveInterval()方法来查看当前Session对象的最大不活动时间
*
* 3. 立即销毁
* 通过session.invalidate()方法
*
* 4.关闭浏览器
* session底层依赖cookie,cookie对象默认只在浏览器内存中存活,关闭浏览器即失效
*
* 5.关闭服务器
* 关闭服务器,session销毁
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session对象
HttpSession session = req.getSession();
//设置域对象
session.setAttribute("uname", "admin");
/*//Session 对象的最大不活动时间
System.out.println("当前Session对象的最大不活动时间:"+session.getMaxInactiveInterval());
//修改Session 对象的最大不活动时间为15秒
session.setMaxInactiveInterval(15);*/
//立即销毁
session.invalidate();
}
End
简单理解cookie和session和cookie就是一个字典,只是一个储存在服务器、一个存储在客户端。
相关文章
- 医疗领域应用大数据技术的难题:收集信息
- JS——正则表达式应用 12306注册界面
- Servlet高级应用---Servlet与缓存
- 如何用更优雅的技术方案实现应用内多弹窗效果
- org.springframework.web.servlet.DispatcherServlet' is not assignable to javax.servlet.Servlet
- 两个Web应用必须的Servlet Filter
- .Net Core Web应用加载读取Json配置文件
- 《Swift iOS应用开发实战》——第2章 搭建计算器的界面
- 《Spark大数据处理:技术、应用与性能优化》——1.4 Spark分布式架构与单机多核架构的异同
- maven tomcat10 servlet api 不兼容 包名javax变成jakarta 实例化Servlet类 异常
- 【快应用】启动车机模拟器失败
- 【web后端(十一)】jsp、servlet_会话管理_servletContext应用示例
- 【UML】UML在软件开发各个阶段的应用
- 微擎 安装应用模块 数据表未安装
- 2018-06-27 基础应用