[JavaWeb]CookieSession 和 Filter 过滤器
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaWeb]CookieSession 和 Filter 过滤器相关的知识,希望对你有一定的参考价值。
一、Cookie
1. Cookie 的定义、创建和获取
- Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后,每次请求都发送给服务器,每个 Cookie 的大小不能超过 4kb
- Cookie 对象的创建
// 1. 解决浏览器相应中文乱码问题
resp.setContentType("text/html; charset=UTF-8");
// 2. 创建 Cookie 对象
Cookie name = new Cookie("name", "Spring-_-Bear");
// 3. 通知客户端保存 Cookie 对象
resp.addCookie(name);
服务器通知客户端保存 Cookie 对象时通过设置响应头 Set-Cookie 从而让客户端保存 Cookie 对象信息
- 服务端获取客户端的 Cookie 对象,在客户端请求头中存有 Cookie 对象,请求时会一并发送给服务器
Cookie[] cookies = req.getCookies();
2. Cookie 值的修改
- 创建与原 Cookie 相同的键的新 Cookie 对象,同时赋予新 Cookie 对象新的 Value 值,以替换方式达到修改 cookie 的目的
- 先查找到需要修改的 Cookie 对象,调用其 setValue() 方法赋予新的值
- 对于 Version 0 Cookie,值不应该包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号、不能包含中文,当需要包含以上内容时,需先使用 BASE64 编码
3. Cookie 的存活设置
- Cookie 的生命控制是指 Cookie 的生命周期,即什么时候被销毁
cookie.setMaxAge(int)
- 正数:表示在指定的秒数后销毁
- 负数:表示关闭浏览器的同时销毁 (默认行为,默认值是 -1)、Session 级别
- 零:立刻销毁
4. Cookie 的 path 属性
- Cookie 的 path 属性可以有效过滤哪些 cookie 发送给服务器,哪些 cookie 不发以及 Cookie 发送的地址,path 属性是通过请求的地址来进行有效过滤的
- 设置 cookie 的 path 属性
cookie.setPath(req.getContextPath() + "/abc"); // /工程路径/abc
5. Cookie 练习之免用户名登录
UserServlet login() 方法中的实现
if ("bear".equals(username) && "bear".equals(password))
System.out.println("登录成功");
Cookie cookie = new Cookie("username", username);
// cookie 对象一周内有效
cookie.setMaxAge(60 * 60 * 24 * 7);
resp.addCookie(cookie);
else
System.out.println("登录失败");
二、Session
1. Session 的定义、创建和获取
- Session 是一个接口(HttpSession),是浏览器与服务器建立的会话,用来维护一个客户端和服务器之间关联的一种技术,每个客户端都有自己的一个 Session 会话。在 Session 会话中,经常用来保存用户登录之后的信息
- Cookie 和 Seesion 的区别:Cookie 保存在客户端,而 Session 保存在服务器
req.getSession()
第一次调用是创建 Session 会话,之后调用都是获取第一次创建好的 Session 会话对象,可以使用session.isNew()
方法判断对应的 session 对象是否是刚刚创建好的session.getId()
可以获取 Session 会话的唯一 id
2. Seesion 的超时控制
int maxInactiveInterval = session.getMaxInactiveInterval();
可以获取 Session 对象的默认超时控制,默认时长为 1800s,因为在 tomcat 服务器的配置文件 web.xml 中进行了默认时长配置,配置了 Tomcat 服务器下的所有 Session 超时配置默认时长均为 30 分钟
<session-config>
<session-timout>30</session-timeout>
</session-config>
- 可以在自己的 web 工程中的 web.xml 中写入以上相同配置,配置此工程中的所有 Session 会话的默认超时时长
- 若只想修改特定的 Session 会话的超时时长,可使用
session.setMaxInactiveInterval(60 * 60 * 24 * 7);
方法进行单独设置,单位为秒- Session 超时是指客户端两次请求的最大间隔时长,未达到最大间隔时长再次请求,则超时时间重置为最大间隔时长
- 使当前 Session 会话马上超时
session.invalidate();
- Session 会话在浏览器关闭的同时销毁,Session 底层实现基于 Cookie 技术
3. session 钝化与活化
- 当服务器正常关闭(浏览器未关闭)时,还存活着的
session
(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser
”)的形式存储在tomcat
的work
目录下,这个过程叫做Session
的钝化- 当服务器再次正常开启(浏览器仍然没有关闭)时,服务器会找到之前的“
SESSIONS.ser
” 文件,从中恢复之前保存起来的Session
对象,这个过程叫做Session
的活化
4. 浏览器和 Session 之间关联的技术内幕
三、Filter
1. Filter 的定义
- Filter 过滤器是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
- Filter 过滤器它是 JavaEE 的规范,也就是接口;它的主要作用是拦截请求、过滤响应。拦截请求常见的应用场景有权限检查、日志操作、事务管理等等。
2. Filter 的使用示例
- 编写类实现 javax.servlet.Filter 接口
/**
* @author Spring-_-Bear
* @datetime 2022/3/5 8:36
*/
public class AdminFilter implements Filter
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
if (user == null)
// 未登录,跳转到登录页面
req.getRequestDispatcher("/index.jsp").forward(servletRequest, servletResponse);
return;
else
// 过滤检查通过,正常访问请求的资源
filterChain.doFilter(servletRequest, servletResponse);
@Override
public void init(FilterConfig filterConfig) throws ServletException
// 一定要删除此方法中调用父类方法的语句,否则 Tomcat 运行报错
@Override
public void destroy()
// 一定要删除此方法中调用父类方法的语句,否则 Tomcat 运行报错
- 在 web.xml 中配置 Filter 拦截路径
<!-- 配置一个Filter 过滤器 -->
<filter>
<!-- 类别名 -->
<filter-name>AdminFilter</filter-name>
<!-- 全类名 -->
<filter-class>com.bear.filter.AdminFilter</filter-class>
</filter>
<!-- 配置 Filter 过滤器的拦截路径 -->
<filter-mapping>
<!-- 表示当前的拦截路径给哪个 filter 使用 -->
<filter-name>AdminFilter</filter-name>
<!-- 配置拦截的资源路径
/ 表示 http://localhost:8080/工程名/ 映射到 IDEA 的 web 目录 -->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
3. Filter 的生命周期
- Filter 生命周期中的重要方法:构造器、init 初始化方法、doFilter 过滤方法、destroy 销毁方法
- 构造器、init 在 web 工程启动的时候执行;doFilter 方法每次拦截到请求就会执行;destroy 方法在 web 工程停止的时候执行
4. FilterConfig 类
FilterConfig 类是 Filter 类的配置文件类,Tomcat 每次创建 Filter 的时候会同时创建一个 FilterConfig 类,此类中包含了 Filter 配置文件的配置信息,主要有以下作用:
- 获取 Filter 的名称 filter-name
filterConfig.getFilterName()
- 获取在 web.xml 中配置的 init-param 初始化参数
filterConfig.getInitParameter("username");
- 获取 ServletContext 对象
filterConfig.getServletContext();
5. FilterChain 多个过滤器执行的细节
- FilterChain 过滤器链的作用是:如果有下一个 Filter 则执行,没有下一个 Filter 则执行请求的目标资源
- 在多个 Filter 过滤器执行的时候,它们执行优先顺序是由它们在 web.xml 中从上到下配置的顺序决定,跟类名没有关系
- 所有 Filter 和目标资源默认都执行在同一线程中
- 以上多个 Filter 共同执行的时候使用同一个 Request 对象,属于同一次请求
- Filter 过滤器只关心请求的地址是否符合拦截条件,不关心请求的资源是否存在
6. Filter 拦截路径的三种配置方式
精确匹配、目录匹配、后缀名匹配
<!-- 拦截地址必须以 .后缀名 结尾才会被拦截,配置文件不能以 / 打头 -->
<url-pattern>*.html</url-pattern>
以上是关于[JavaWeb]CookieSession 和 Filter 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
[JavaWeb]CookieSession 和 Filter 过滤器