深入了解会话跟踪技术、过滤器、EL、JSTL

1.会话跟踪技术:对同一个用户跟服务器的连续请求和接收响应的监视过程;

为什么要会话跟踪:

因为http协议是一种无状态的协议,也就是说它没法记录用户的状态,在类似于购物网站、电子邮箱,多次请求的操作,无法判断是否是同一个用户在执行,因此需要使用会话跟踪技术;

2.五种会话跟踪技术:

1.Cookie:以键值对的方式保存信息,存储在客户端浏览器;

运作方式:

web浏览器端向服务端发送登录的请求,服务端接收后进行鉴权,如果没问题就响应web浏览器,发送set-cookie响应头字段,并将用户的信息也附带回去,之后每次web浏览器向服务端发送新的请求,都会携带cookie,以向服务端说明用户的登录状态;

cookie的大小默认为4kb,生命周期到浏览器关闭

缺点:

(1)cookie的安全性较差,因为用户可以在浏览器修改cookie中的信息,可能会造成安全问题;

(2)用户可以在浏览器端主动禁用cookie;

(3)大小较小,无法存储较全的用户信息;

2.Session:依赖于cookie技术,存储在服务端

运作方式:

web浏览器向服务端发送登录的请求,服务端接收后进行鉴权,如果没问题就响应web浏览器,生成特定的session-id和它的生命周期,发送set-cookie相应头字段, 并附加上session-id,之后浏览器每次请求服务端都会以cookie的形式传递session-id,服务器端对session-id进行验证,匹配成功则视为合法用户,可获得用户的登录状态、专属数据。匹配失败则视为未登录;

声明周期:服务端给定的声明周期

缺点:

(1)服务器资源占用大,高并发场景性能瓶颈明显;

(2)集群、分布式部署下,存在会话共享问题;

(3)依赖于cookie,继承了cookie的部分缺点;

3.Token

运作方式:

web浏览器向服务端发送登录的请求,服务端接收后进行鉴权,如果没问题就响应web浏览器,生成特定的JWT令牌,里面包括(用户标识、过期时间、签名),服务端把JWT直接返回给浏览器;浏览器收到JWT后,自己保存起来,之后每一次请求,浏览器都会把JWT放在请求头中发送给服务端,如果服务端验证无误就认为是合法用户;

4.重写URL:用于应对用户禁用cookie的情况

如果用户禁用了cookie,那么就没法在浏览器端通过cookie存储sessionID,所以我们就把sessionID放在URL中,每次请求读取URL就好了;

5.隐藏表单域

使用html的input type ='hiden'控件,在网页表单中隐藏相关客户端信息,在提交表单时,将信息一并发给服务端,服务端通过追踪sessionID,去追踪用户状态;

3.过滤器:

属于web应用的组件,具有拦截客户端请求的功能,针对这些请求做处理,拦截服务端的响应数据,做处理。

使用场景:权限管理、编码、日志、性能监控;

xml配置方式:

XML 复制代码
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.coder.util.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

注解方式:

@WebFilter("/*")

初始化参数配置:

XML 复制代码
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.coder.util.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

初始化参数注解:

java 复制代码
@WebFilter(value = "/*",
initParams = {@WebInitParam(name = "encode",value = "gbk")})

FilterConfig对象,调用getInitParameter("参数名")方法,获取参数值;

4.EL:主要用于在jsp页面上获取数据,擅长查找对象,配合jstl,使jsp拜托大量的java代码片

语法:${表达式内容}

EL表达式不会处理空指针异常,没有数组下标越界问题,没有字符串拼接问题

html 复制代码
<% String[] strs={"a","b","c"};
request.setAttribute("strs",strs);%>
${strs[0]}<br>
${strs[3]}<br>
<%--${strs[0]+strs[1]} 会当成数字去运算--%>
${strs[0]}${strs[1]}
<%--<% String str="";
request.setAttribute("str",str);%>
${str}
${empty str}--%>
<!--判断是否为空 null 或空串-->
<%--判断是否为null或空串--%>

jsp表达式注释:
<!--注释 查看源代码会显示-->
<%--注释 查看源代码也不显示--%>
EL表达式的运算符:

css 复制代码
${"1"=="1"} ${"1" eq "2"}
<br>
${1!=2} ${1 ne 2}
<br>
${1<2} ${1 lt 2}
<br>
${1<=2} ${1 le 2}
<br>
${1>2} ${1 gt 2}
<br>
${1>=2} ${1 ge 2}
<br>
${5>3 && 3>2} ${5>3 and 3>2}
<br>
${5>3 || 3>2} ${5>3 or 3>2}
<br>
${!5>3} ${not 5>3}
empty 判断对象是否为null,判断字符串是否是空串或null值,判断集合是否为空
<%
List<String> list=new ArrayList<>();
list.add("AAA");
request.setAttribute("list",list);
%>
${empty list}

el表达式的隐式对象:


JSTL:
使用注意:
需要导入jar包
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>;
forEach循环标签遍历数组

css 复制代码
<%--循环 从1-10的循环--%>
<%--<%
for (int i=1;i<=10;i++){
out.print(i+"<br>");
}
%>--%>
<c:forEach var="i" begin="20" end="30">
<%--<c:out value="${i}"/><br>--%>
${i}<br>
</c:forEach>

forEach遍历引用类型集合类:

css 复制代码
<%--循环字符串集合--%>
<%
List<String> list= Arrays.asList("A","B","C");
request.setAttribute("list",list);
%>
<c:forEach items="${requestScope.list}" var="s" varStatus="vs">
${vs.count}&nbsp;${s}<br>
</c:forEach>


<%--引用类型循环集合--%>
<%
List<GoodsType> list=new ArrayList<>();
GoodsType type1=new GoodsType(1,"水果");
GoodsType type2=new GoodsType(2,"饮料");
GoodsType type3=new GoodsType(3,"洗漱");
list.add(type1);
list.add(type2);
list.add(type3);
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="type" varStatus="vs">
${vs.count}&nbsp;${type.id}&nbsp;${type.typename}<br>
</c:forEach>

属性说明:
items:集合,用el表达式说明
var:每次取出的临时变量;
varStatus:循环状态,下标;
index:索引,从0开始;
count:统计循环次数,从1开始;
first:boolean返回是否是第一个元素;
last:boolean返回是否是最后一个元素;
begin:循环的初始;
end:循环的终点;
step:步长,循环间的数值;
if判断:

css 复制代码
<% int x=11;
request.setAttribute("x",x);
%>
<c:if test="${x%2==0}">偶数</c:if>
<c:if test="${x%2==1}">奇数</c:if>

test=后面是条件;

c:choose c:when c:otherwise条重判断

css 复制代码
<% int age = 10;
request.setAttribute("age",age);
%>
<c:choose>
<c:when test="${age<18}">少年</c:when>
<c:when test="${age<30}">青年</c:when>
<c:when test="${age<45}">中年</c:when>
<c:otherwise>老年</c:otherwise>
</c:choose>

c:redirect 重定位标签,和servlet中response.sendRedirect功能相同

css 复制代码
<c:redirect url="GoodsTypeServlet?flag=selectList"/>

c:param 传递参数

css 复制代码
//第一个jsp
<c:redirect url="el.jsp">
//下面的参数,会缀到url地址上
<c:param name="email" value="222345345@qq.com"/>
</c:redirect>
//第二个 el.jsp
${param.email}

c:cul生成一个url标签,可以实现url重写机制

css 复制代码
<a href="<c:url value="GoodsTypeServlet?flag=selectList"/>">用户管理</a>

c:set标签 设置数据

设置基本数据类型

css 复制代码
<%
int x=100;
request.setAttribute("x",x);
%>
<c:set var="x" value="100" scope="request"/>
<c:out value="${x}"/>

设置对象的属性:

css 复制代码
<%
GoodsType type=new GoodsType();
type.setId(1);
type.setTypename("水果");
request.setAttribute("type",type);
%>
没重新设置之前<Br>
${type.typename}<br>
设置之后
<c:set target="${type}" property="typename" value="数码"/>
${type.typename}
相关推荐
小七-七牛开发者15 小时前
周一上线 | SpaceX 收购 Cursor、支付宝进入 AI 时代、DeepSeek 完成 500 亿元融资
ai·agent·token·glm·智谱·claudecode·ai coding·周一上线
写点啥呢7 天前
GLM HUD用量实时显示
claude·token·hud·glm
深蓝电商API8 天前
浏览器自动化中的Cookie和Session管理最佳实践
数据采集·cookie·session
理人综艺好会9 天前
双Token机制在实际项目中的应用与实践
中间件·token
学代码的真由酱10 天前
【自用】接口测试
接口测试·postman·测试·cookie·token鉴权
XLYcmy10 天前
一个基于 Python 的轻量级 LLM(大语言模型)API 客户端程序:从API交互到LLM应用架构
服务器·python·ai·llm·prompt·agent·token
小七-七牛开发者12 天前
AI Agent 的 4 个工程关键词:Prompt、Context、Loop、Harness 到底是什么?
ai·大模型·agent·token·context·loop·codex·harness
遇事不決洛必達15 天前
【爬虫随笔】深入理解 HTTP/HTTPS 协议、接口交互与会话机制
爬虫·网络协议·http·https·session
ZorChi15 天前
AI API 调用优化实战:统一入口与超时处理指南
人工智能·aigc·接口·api·agent·token·中转站
极光代码工作室16 天前
基于SpringBoot的任务管理系统
java·springboot·web开发·后端开发