当前位置: 首页 > news >正文

会话技术 Cookie和Session对象

一、会话概述

客户端与服务器之间的一次交互过程中将双方的一些数据进行保存,Servlet提供了两个用于保存会话数据的对象,分别是Cookie和Session。

二、Cookie对象

2.1 概念

cookie的功能就是保存用户上一次访问时留存下的数据,当该浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确地响应。

当服务器向客户端发送Coolie时,会在HTTP响应头中增加Set-Cookie响应头字段,Cookie必须以键值对的形式存在,Cookie属性可以有多个,属性之间用分号“;”和空格分隔。

2.2 Cookie构造方法

public CookieString name,String value):参数name用于指定Cookie的名称,value用于指定Cookie的值 ,Cookie一旦创建,它的名称就不能再更改,Cookie的值可以为任何值,创建后允许被修改。

2.3 Cookie常用方法

setMaxAge(int expiry)和getMaxAge()方法分别用于设置返回Cookie在浏览器上保持有效的秒数。设置正数,没有超过时间,一直有效,即便关闭浏览器。设置负数,将Cookie信息保存缓存,浏览器关闭,Cookie信息被删除。设置为0,浏览器立刻删除Cookie信息。

setPath(String uri)方法和getPath()方法是针对Cookie的Path属性的。如果创建的某个Cookie对象没有设置Path属性,那么该Cookie只对当前访问路径所属的目录及其子目录有效。如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPath()方法将其Path属性设置为“/”。

setDomain(String pattern)方法和getDomain()方法是针对Cookie的domain属性的。domain属性用于指定浏览器访问的域。

案例实现

@WebServlet("/lastTime")
public class DemoTime01 extends HttpServlet {private static final long l = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");//获取会话对象Cookie[] cookies = req.getCookies();boolean flag = false;//遍历if (cookies.length > 0 && cookies != null) {for (Cookie cookie : cookies) {//获取Cookie名称String name = cookie.getName();//判断名称是否为lastTimeif ("lastTime".equals(name)) {//不是第一次访问,获取时间flag = true;String value = cookie.getValue();System.out.println("解码前:" + value);//URL解码value = URLDecoder.decode(value, "utf-8");System.out.println("解码后:" + value);resp.getWriter().write("欢迎回来,您上次访问时间为:" + value);//设置cookie的value//获取当前时间的字符串,重新设置cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat timesdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_time = timesdf.format(date);System.out.println("编码前:" + str_time);//URL编码str_time = URLEncoder.encode(str_time, "utf-8");System.out.println("编码后:" + str_time);cookie.setValue(str_time);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 24 * 30);    //一个月//加入当前cookie请求时间resp.addCookie(cookie);break;}}}//如果cookies中没有时间,也就是没有访问过if (cookies == null || cookies.length == 0 || flag == false) {//设置cookie的value//获取当前时间的字符串,重新设置cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前:" + str_date);//URL编码str_date = URLEncoder.encode(str_date, "utf-8");System.out.println("编码后:" + str_date);Cookie cookie = new Cookie("lastTime", str_date);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 24 * 30);//一个月resp.addCookie(cookie);resp.getWriter().write("您好,欢迎您首次访问");}}
}

运行结果

第一次访问

刷新后访问

三、Session对象

3.1 概念 

当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将ID传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。在这个过程中,Session会将id属性交给cookie存储,之后通过id属性在服务器找到session对象。

3.2 Session常用方法

获取session对象:

  • public HttpSession getSession(boolean create):根据传递的参数判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。
  • public HttpSession getSession():相当于第一个方法参数为true时的情况,由于getSession()方法可能会产生发送会话标识号的Cookie头字段,所以必须在发送任何响应内容之前调用getSession()方法。

3.3 Session的生命周期

Sessinon在用户第一次访问服务器时创建,需要注意只有访问JSP(JSP将在第6章讲解)、Servlet等程序时才会创建Session。此外,还可调用request.getSession(true)强制生成Session。只访问HTML、IMAGE等静态资源并不会创建Session.

当客户在一段较长的时间内没有请求访问,那么web服务器会结束请求。

session失效(强制)

可以强制生成session,也可以强制摧毁:invalidate()方法,该方法可以强制使Session对象失效。

设置时间失效

Tomcat服务器下的web.xml中默认是30分钟失效

第一种:在web.xml中

    <!--单位为分钟--><session-config><session-timeout>30</session-timeout></session-config>

第二种:在Servlet程序中手动设置

session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期


http://www.mrgr.cn/news/66849.html

相关文章:

  • SQL中的IN语句和EXISTS语句
  • JavaEE-多线程初阶(3)
  • 如何从 Android 图库中恢复误删除的照片
  • 学习threejs,导入OBJ格式的模型
  • React05 样式控制 classnames工具优化类名控制
  • 第二十八章 Vue之自定义指令
  • golang安装,常用框架安装,记忆点
  • 2024系统架构师---论软件系统架构风格论文
  • Elasticsearch与Redis的Netty冲突
  • flink 内存配置(四):内存调优和问题处理
  • mysql5安全审计
  • 使用Python编写一个微信机器人
  • AIGC在游戏设计中的应用及影响
  • flutter区别于vue的写法
  • vue通过iframe方式嵌套grafana图表
  • python安装selenium,geckodriver,chromedriver,Selenium IDE
  • ei会议检索!智能控制、测量、信号系统等方向可投!
  • Linux(CentOS)安装 JDK
  • Nvidia突袭AI江湖!悄悄发布新模型,完爆OpenAI和Anthropic?
  • 美国最欢迎这些人!盘点10大移民美国最具优势职业!
  • 【Git】Git常用命令
  • 迅为RK3568开发板支持银河麒麟和开放麒麟系统
  • 【 院士、校长、杰青、Fellow等大咖齐聚!IEEE独立出版】第六届机器人、智能控制与人工智能国际学术会议(RICAI 2024,12月6-8日)
  • DevEco在设备上运行hap报错: Error message: The caller is not a system application
  • 【新手入门软件测试--该如何分辨前后端问题及如何定位日志--前后端问题分辨与日志定位查询问题】
  • ssm063基于SSM框架的德云社票务系统的设计与实现+vue(论文+源码)_kaic