Servlet 会话跟踪基础

news2024/11/30 13:31:04

文章目录

  • 前言
  • Cookie实例
    • Cookie缺点
    • Cookie案例代码
  • Session
    • Session的创建与销毁
      • Session的创建
      • Session的销毁
  • Session和Cookie的区别
    • 不同
    • 联系


前言

提示:这里可以添加本文要记录的大概内容:

在Web应用程序中,会话跟踪是一种技术,可以在客户端和服务器之间保持持久连接,以便跟踪用户在不同页面之间的活动。

Servlet的会话跟踪可以通过以下方式实现:

  1. Cookies:Servlet可以将一个唯一标识符存储在客户端的Cookie中,以便在每次请求中跟踪用户会话。

  2. URL 重写:Servlet 可以将唯一标识符添加到URL中,以便在每个请求中跟踪用户会话。

  3. 隐藏表单字段:Servlet可以将唯一标识符添加到表单字段中,以便在每个请求中跟踪用户会话。

  4. HttpSession 对象:Servlet 可以使用 HttpSession 对象,在服务器端维护用户会话状态。每个 session 对象都有一个唯一的标识符,可以在服务器端跟踪用户会话。


提示:以下是本篇文章正文内容,下面案例可供参考

Cookie实例

准备发送cookie给前端:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/cookie1")
public class SendCookieToClientServlet extends HttpServlet{
	//动态项目      没有去 其他下找 web
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("准备发送cookie给客户端");
		Cookie cookie = new Cookie("login", "zhangsan");
		cookie.setMaxAge(60*60*24*7);  //单位是:秒,这里是7天
		resp.addCookie(cookie);
		
	}
}

运行项目:
在这里插入图片描述
说明代码生效了,cookie发给了客户端

获取客户端的cookie:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cookie2")
public class ReciveCookieFromClinetServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("获取客户端的cookie");
		Cookie cookiesCookie [] = req.getCookies();
		for (int i = 0; i < cookiesCookie.length; i++) {
			Cookie cookie = cookiesCookie[i];
			System.out.println(cookie.getName()+"-"+cookie.getValue());
		}
	}
}

重启服务器,清除控制台,网页运行链接
在这里插入图片描述
Cookie技术核心:第一次访问时,服务器端发送一些Cookie信息保存到客户端,在有效期内,在同一个客户端里面,向服务器再发请求的时候,默认会把Cookie再发给服务器

Cookie缺点

安全性不高
兼容性问题
时效性问题
存储容量限制

Cookie案例代码

【例1:从Servlet向客户端存入cookie】

//SetCookie Servlet
Cookie c=new Cookie("season","spring");
c.setMaxAge(30);
response.addCookie(c);
Cookie d=new Cookie("nextseason","summer");
d.setMaxAge(10);
response.addCookie(d);

【例2:在客户端读取cookie】

//getCookie.jsp
<%
Cookie[] a=request.getCookies();
for(int i=0;i<a.length;i++)
{
out.println(a[i].getName()+:"+a[i].getValue()+"<br>");
}
%>

【例3:利用cookie计数】

//visitCount.jsp计数次数
<%@ page contentType="text/html;charset=UTF-8" %>
<%int count = 0; 
 Cookie[] cookies = request.getCookies(); / / 得到所有的Cookie
if(cookies != null) { 
   for(int i=0; i<cookies.length; i++) {
       if(cookies[i].getName().equals("Counter"))
            count = Integer.parseInt(cookies[i].getValue());  //获取Counter以前值
   }  }
count++;
if(count == 1)
   out.println("欢迎首次光临");
else 
  out.println("您已经光临了" + count+"次");
// 将新的count写入客户端
Cookie c = new Cookie("Counter", ""+count);
c.setMaxAge(60*60*24*365);       // Cookie 的有效期为 1 年
response.addCookie(c); %>

【例4:删除cookie】

//cookie remove.jsp
<%
int count=0;
// 将新的count写入客户端
Cookie c = new Cookie("Counter", ""+count);
c.setMaxAge(0);       // Cookie 的有效期为 0
response.addCookie(c); %>

【例5:购物车登录实验,1、从首页进入购物车页面】

//首页home.html
<a href="cart.jsp">购物车</a>
<a href=”remove.jsp”>删除计数cookie</a>

【例5:购物车登录实验,2、购物车页面,先判断用户是否已经登录,否则跳转登录页面login.html】

//购物车  cart.jsp
<h1>购物车</h1>
<%int count = 0; 
 Cookie[] cookies = request.getCookies(); // 得到所有的Cookie
if(cookies != null) { 
   for(int i=0; i<cookies.length; i++) {
       if(cookies[i].getName().equals("Counter"))
            count = Integer.parseInt(cookies[i].getValue());  //获取Counter以前值
   }  }
 
if(count==0)response.sendRedirect(request.getContextPath()+"/login.html");
%>
//login.html
<h1>用户登录</h1>
	<form action="visit.jsp" method="post">
		用户名<input type="text" name="user"><br><br>
		密码
		<input type="password" name="password"><br>		
		<input type="submit" value="提交">
	</form>
//visit.jsp
<%int count = 0; 
 Cookie[] cookies = request.getCookies(); // 得到所有的Cookie
if(cookies != null) { 
   for(int i=0; i<cookies.length; i++) {
       if(cookies[i].getName().equals("Counter"))
            count = Integer.parseInt(cookies[i].getValue());  //获取Counter以前值
   }  }
 
count++;
if(count == 1)
  response.getWriter().println("欢迎首次光临");
else 
  response.getWriter().println("您已经光临了" + count+"次");
 
// 将新的count写入客户端
Cookie c = new Cookie("Counter", ""+count);
c.setMaxAge(60*60*24*365);       // Cookie 的有效期为 1 年
response.addCookie(c); 
response.sendRedirect(request.getContextPath()+"/cart.jsp");
%>

Session

使用Session维护一个会话的登陆状态:

  1. 当第一次请求时,在服务器端创建一个Session对象,并且为此对象生成一个sessionId。
  2. 同时,使用Cookie将此sessionId返回给客户端,并存储在客户端的Cookie中。
  3. 当客户端发起下一次请求时,必须携带此sessionId发送给服务器端。
  4. 服务器端根据接收的sessionId,就能找回Session对象,从而获取了上一次请求的信息。

创建StoreDataServlet类:用于在HttpSession中存储一个User对象(代表用户信息)。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.sun.org.apache.bcel.internal.generic.NEW;
import po.User;
@WebServlet("/store")
public class StoreDataServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		session.setAttribute("login", new User(1,"二哈喇子","吃饭快"));
	
	}
}

创建User类:表示用户实体,包括用户ID、用户名和角色。

public class User {
	private Integer id;
	private String name;
	private String role;
	public User() {
		super();
		// TODO 自动生成的构造函数存根
	}
	public User(Integer id, String name, String role) {
		super();
		this.id = id;
		this.name = name;
		this.role = role;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", role=" + role + "]";
	}
	
}

创建GetDateServlet类:用于从HttpSession中读取存储的User对象,并输出到控制台上。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/get")
public class GetDateServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		System.err.println(session.getAttribute("login"));
		
	}
}

这个Web应用程序基于Servlet API实现了会话(Session)管理的功能,即在服务器端存储和管理用户会话信息。当用户登录后,其用户信息会被存储到HttpSession对象中,之后在用户会话期间,这些信息可以被其他Servlet类或JSP页面访问和使用。通过会话管理技术,Web应用程序可以更方便地实现用户状态的管理和控制,提高应用程序的安全性和可靠性。

重启服务器,清除控制台,网页运行链接store存储
在这里插入图片描述
运行get路径取出
在这里插入图片描述

Session的创建与销毁

Session的创建

调用request.getSession() 方法获取此Session对象

  1. 无参: getSession() 如果存在一个Session对象,把有的返回,如果没有就让服务器创建新的Session对象。
  2. 有参:有参的传一个布尔类型,如果是true就和无参效果一样;如果是false,如果找不到Session对象就不会创建新的了,返回null

没有调用getSession方法则不会创建session。

Session的销毁

Session的销毁只有两种情况:
第一:session调用了 session.invalidate()方法。
第二:前后两次请求超出了session指定的生命周期时间。

默认15分钟销毁,也可以主动销毁

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//单词多个r
@WebServlet("/destroy")
public class DestroySessionServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		session.invalidate();
	}
}

重启服务器,清除控制台,网页依次运行链接
在这里插入图片描述
在这里插入图片描述
接下来再运行destroy销毁

最后再运行get获取
在这里插入图片描述
超时销毁:
请添加图片描述

    <session-config>
    	<session-timeout>30</session-timeout>
    </session-config>

超时销毁试完后把代码删除

Session和Cookie的区别

1、Cookie可以存储在浏览器或者本地,Session只能存在服务器
2、session能够存储任意的java对象,cookie 只能存储String 类型的对象
3、Session比Cookie更具有安全性 (Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
4、Session占用服务器性能,Session过多,增加服务器压力
5、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。

不同

存放地点:cookie存放在客户端的硬盘里,属于离线存放,而session存放在服务器的内存中。

存活时间:cookie可以长期存放在客户端,具体的存活时间由setMaxAge()方法所指定的数值决定,session随用户访问服务器而产生,随客户超时或下线而消失。

安全性:cookie存放在客户端,可能会被别有用心的网站读取,安全性较差,而session存放在服务器的内存中,用户不能修改,且随客户端浏览器的关闭而消失,安全性较好。

联系

不论是cookie还是session隐含对象都需要浏览器支持cookie并且没有禁用cookie。

虽然Session存储在服务器端内存中,但客户端的浏览器需要通过Cookie中的Session ID来标识自己,并通过该ID与服务器上的Session进行绑定,从而实现客户端与服务器端的会话状态管理。
因此Session与Cookie实际上是相互关联的,两者通常一起使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+element-ui通用后台管理系统(适合新手)

vueelement-ui通用后台管理系统&#xff08;适合新手&#xff09; 1、使用到的技术 使用vue2element-uiaxiosjs-cookielessecharts实现的一个简易的通用后台管理系统&#xff0c;具有很强的可扩展性&#xff0c;修改简单&#xff0c;只要有点前端基础就能看懂&#xff1b; 2…

汇编 -20230718

一. 练习&#xff1a; 1. 1-100的和 .text .globl _start_start:mov r0, #0 存放结果mov r1, #0 存放当前数mov r2, #100 结束条件的数addFun:add r1, r1, #1add r0, r0, r1cmp r1, r2bne addFunstop:b stop.end结果展示&#xff1a;

将DAST集成到CI/CD管道中的优势和实施步骤

在当今快速发展的网络环境中&#xff0c;维护Web应用程序的安全更加必要。由于漏洞的出现速度比以往任何时候都要快&#xff0c;将动态应用程序安全测试&#xff08;DAST&#xff09;集成到持续集成/持续部署&#xff08;CI/CD&#xff09;管道中成为改变游戏规则的因素&#x…

uni-app:单位像素rpx

rpx:响应式单位&#xff0c;长宽可以随着屏幕大小改变&#xff0c;其尺寸根据iPhone 6的标准来参考&#xff08;750rpx为占满屏幕宽&#xff0c;1334rpx为占满屏幕长。7501334rpx&#xff09; 例子&#xff1a; 现在展示型号为iPhone 12 pro的型号&#xff0c;这里750px和750…

利用大模型进行法律判决预测

概述 本文研究背景是法律专业人员常用的演绎推理方法&#xff0c;即法律演绎&#xff0c;用于案例分析。 过去的方法主要是通过学习、微调或示例来教授大型语言模型&#xff08;LLM&#xff09;进行法律判决预测。这些方法存在的问题是学习样本有限&#xff0c;解释性差。因此…

02 - 如何制定性能调优策略?

1、性能测试攻略 性能测试是提前发现性能瓶颈&#xff0c;保障系统性能稳定的必要措施。下面我先给你介绍两种常用的测试方法&#xff0c;帮助你从点到面地测试系统性能。 1.1、微基准性能测试 微基准性能测试可以精准定位到某个模块或者某个方法的性能问题&#xff0c;特别…

数仓-零基础小白到入土-学习路线

数仓-零基础小白到入土-学习路线 铺垫一下下讲在前面涉及基础技术栈&#xff1a;中级&#xff1a;全部掌握之后&#x1f446;&#xff1a;去刷面试题&#xff1a; 初级中级高级博主独家面试题&#xff1a;数仓名词&#xff1a;催更我戳戳个人主页&#xff1a;[up自己的网站](ht…

Kafka - 分区中各种偏移量的说明

文章目录 引子名词解释分区中各种偏移量的说明 引子 名词解释 Kafka是一个高性能、高吞吐量的分布式消息系统&#xff0c;被广泛应用于大数据领域。在Kafka中&#xff0c;分区是一个重要的概念&#xff0c;它可以将数据分发到不同的节点上&#xff0c;以实现负载均衡和高可用性…

【PHP面试题73】TCP和UDP的特点和区别是什么?

文章目录 一、前言二、TCP&#xff08;Transmission Control Protocol&#xff09;三、UDP&#xff08;User Datagram Protocol&#xff09;四、TCP和UDP的区别五、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&a…

Go速成-常量

1.常量的定义 Go语言常量&#xff0c;定义的值是不能进修修改的&#xff0c;定义常量就是const&#xff0c;常量定义建议全部大写 const PI float32 3.1415946 //显式定义 const (x int 16ys "abc"z)fmt.Print(x,y,s,z) 在定义常量的时候如果没有声明值&#xff…

微信小程序的目录解析--【浅入深出系列001外篇】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择先说总目录经常碰到的文件(目录&#xff09;最最常见的目录pages次最常用的就是images 目录 操作起来真正的操作 配套资源 本系列校训 用免费公开视频&#xff0c;卷…

关于Qt编译android时候一个问题

问题提示为 FAILURE: Build failed with an exception.* What went wrong: A problem occurred configuring root project android-build. > Could not resolve all artifacts for configuration :classpath.> Could not resolve com.android.tools.build:gradle:3.2.0.…

3天学会Ascend C编程 | Day1 Ascend C基本概念及常用接口

本文分享自《【2023 CANN训练营第一季】——Ascend C算子开发入门——第一次课》&#xff0c;作者&#xff1a;weixin_54022960 。 Ascend C是华为昇腾面向算子开发场景的编程语言&#xff0c;使用C/C作为前端语言的算子开发工具&#xff0c;通过四层接口抽象、并行编程范式、…

【笔记】SpringBoot 2.7.x Feign超时时间配置问题

【笔记】SpringBoot 2.7.x Feign超时时间配置问题 前言使用的技术Feign超时配置处理过程 前言 从 SpringBoot 2.3升级至SpringBoot 2.7.x后&#xff0c;Feign的配置也发生了变化。本文主要记录Feign调用超时时间配置问题。 在解决问题前&#xff0c;也查阅过相关资料&#xff0…

iOS APP外包开发的语言比较

iOS APP是Apple公司运行在iPhone手机上的APP&#xff0c;开发这样的APP有两种开发语言可以选择&#xff0c;都是由Apple公司提供的语言。其中Objective-C使用时间相对较长&#xff0c;有历史兼容考虑&#xff0c;而Swift是新的开发语言&#xff0c;更符合近些年开发语言的发展理…

怎么在Windows WSL上利用GPU运行tensorflow 2.12

背景 1. 在window上安装WSL 2. 再WSL上安装miniconda。 3. 创建conda环境 4. 设置GPU 5. 安装tensorflow 2.12 6. 在Pycharm里运行你的GPU Tensorflow 2.12代码 背景 从tensorflow 2.10开始&#xff0c;已经没有tensorflow-gpu相应的版本在Window GPU运行了&#xff0c…

LCD—STM32液晶显示(1.显示器简介及LCD显示原理)(6000字详细介绍)

目录 显示器简介 液晶显示器 液晶 像素 液晶屏缺点 LED显示器 OLED显示器 显示器的基本参数 STM32板载液晶控制原理&#xff08;不带微控制器&#xff09; 液晶控制原理 控制信号线(不带液晶控制器) 液晶数据传输时序 显存 总结 3.2寸液晶屏介绍&#xff08;搭载…

在线乞讨系统 Docker一键部署

begger乞讨网 在线乞讨 全球要饭系统前端界面后端界面H2 数据库 console运行命令访问信息支付平台 在线乞讨 全球要饭系统 在线乞讨全球要饭项目,支持docker一键部署&#xff0c;支持企业微信通知&#xff0c;支持文案编辑 前端界面 后端界面 H2 数据库 console 运行命令 项…

【STM32】使用HAL库对ULN2003控制28BYJ-48步进电机

步进电机是将电脉冲信号转变为角位移或线位移&#xff0c;通过控制施加在电机线圈上的电脉冲顺序、频率和数量&#xff0c;可以控制步进电机的转向、速度和旋转角度。 配合以直线运动执行机构(螺纹丝杆)或齿轮箱装置&#xff0c;更可以实现更加复杂、精密的线性运动控制要求。…

(Linux)查看jar包内容

查看jar包内容cp /opt/services/找到jar路径cp project.jar project2.jar复制jar&#xff0c;防止操作失误unzip -xvf project2.jar查看内容unzip -xvf project2.jar | grep jackson搜索相应内容rm -rf project2.jar删除副本 压缩jar包参考jar -cvf project.jar a.class b.clas…