软件设计之JavaWeb(4)
此篇应在MySQL之后进行学习:
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷全新JavaWeb教程,企业主流javaweb技术栈
资料可以去尚硅谷官网免费领取
此章节最好学完JDBC观看
学习内容:
- 会话管理
- 三大域对象
- 过滤器
1、会话管理
在会话管理中,
Cookie
和Session
都用于保持用户状态。基本流程如下:
1、客户端发起请求:用户访问网站,服务器生成一个唯一的 Session ID。
2、Session 保存在服务器:服务器将用户信息(如登录状态)存储在服务器端的 Session 中,用这个 Session ID 关联用户。
3、Cookie 储存 Session ID:服务器通过响应头将 Session ID 发送给浏览器,浏览器将这个 Session ID 存储在 Cookie 中。
4、后续请求中传递 Cookie:每次用户请求时,浏览器会自动将 Cookie 中的 Session ID 发送给服务器。
5、服务器验证:服务器接收 Session ID,从服务器端的 Session 中检索对应用户数据,验证用户身份。
Cookie
1、服务端创建cookie,将cookie放入响应对象中,Tomcat容器将cookie转化为set-cookie响应头,响应给客户端
2、客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie
Cookie时效性
访问互联网资源时不能每次都需要把所有Cookie带上。访问不同的资源时,可以携带不同的cookie,我们可以通过cookie的setPath(String path) 对cookie的路径进行设置
Session
1、服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONID以cookie的形式放入响应对象
2、后端创建完session后,客户端会收到一个特殊的cookie,叫做JSESSIONID
3、客户端下一次请求时携带JSESSIONID,后端收到后,根据JSESSIONID找到对应的session对象
4、通过该机制服务端通过session就可以存储一些专门针对某个客户端的信息了
Session原理图
req.getSession()获取session流程图
2、三大域对象
1、
请求域对象
是HttpServletRequest ,传递数据的范围是一次请求之内及请求转发
2、会话域对象
是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求
3、应用域对象
是ServletContext,传递数据的范围是本应用之内,可以跨多个会话
区分两次请求、会话
要区分两次请求:
可以通过请求方式(如GET和POST)和请求的URL来加以区分(请求转发算同一次请求)。
第二次会话:如果用户关闭浏览器或会话过期,再次访问同一网站,服务器会认为这是一个新的会话。新的Session ID会被分配,表示新的会话开始。第一次会话:
用户首次访问服务器时,没有Session ID。服务器会为该用户创建一个新的会话,并生成一个唯一的Session ID,通常通过Set-Cookie头设置到客户端的Cookie中。
第二次会话:`如果用户关闭浏览器或会话过期,再次访问同一网站,服务器会认为这是一个新的会话。新的Session ID会被分配,表示新的会话开始。
3、过滤器
web.xml配置过滤器
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>com.atguigu.filters.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<!-- url-pattern 根据请求的资源路径 对指定的请求进行过滤
/* 过滤全部资源
/a/* 过滤以a开头的资源
*.html 过滤以html为后缀的资源
/servlet1 对servlet1的请求进行过滤
servlet-name 根据请求的servlet的别名,对指定的servlet资源进行过滤
一个filter-mapping中可以同时存在多个url-pattern 和servlet-name-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
过滤器java代码
package com.atguigu.filters;
import jakarta.servlet.*;
import java.io.IOException;
/**
* 日志过滤器 记录请求历史 将日志打印到控制台
*
* 1 实现filter接口
* 2 重写过滤方法
* 3 配置过滤器
* web.xml
* 注解
*/
public class LoggingFilter implements Filter {
/*
* 过滤请求和响应的方法
* 1 请求到达目标资源之前,先经过该方法
* 2 该方法有能力控制请求是否继续向后到达目标资源 可以在该方法内直接向客户端做响应处理
* 3 请求到达目标资源后,响应之前,还会经过该方法*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
/*
* 1 请求到达目标资源之前的功能代码
* 比如:判断是否登录,校验权限是否满足
* 2 放行代码
* 3 响应之前 HttpServletResponse转换为响应报文之前的功能代码
* */
//请求到达目标资源之前的代码
System.out.println("loggingFilter before doFilter invoked");
//放行
filterChain.doFilter(servletRequest,servletResponse);
//响应之前的代码
System.out.println("loggingFilter after.doFilter invoked");
}
}
过滤器链
过滤器执行顺序
1、在 web.xml 文件中,过滤器的顺序由其定义的顺序决定。即,按照 filter 和 filter-mapping 标签在文件中出现的顺序依次执行。
2、如果通过注解 @WebFilter 配置过滤器,过滤器的顺序通常是由 @WebFilter 注解中的 @Order 或 @Priority 注解来控制。如果没有指定 @Order 或 @Priority 注解,容器会根据类的加载顺序来决定过滤器的执行顺序,这种情况下是无法明确控制的。