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} ${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} ${type.id} ${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}