目录
1.Filter 什么是过滤器
2.Filter 的初体验
3.Filter 的生命周期
4.FilterConfig 类
5.FilterChain 过滤器链
6.Filter 的拦截路径
①Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是: Servlet 程序、 Listener 监听器、 Filter 过滤器②Filter 过滤器它是 JavaEE 的规范。也就是接口③Filter 过滤器它的作用是: 拦截请求 ,过滤响应。
拦截请求常见的应用场景有:①权限检查②日记操作③事务管理……等等
- 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必 须是用户登录之后才允许访问。
- 思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息即可!!!
对于jsp文件的访问,可以用如下代码实现
<%
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
%>
但是仍可以访问图片、HTML等资源,该如何设置相关权限来访问它们呢?
Filter代码如下:
package com.atguigu.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author 白村客
* @version //TODO
* @date 2022-05-31 14:52
* TODO
*/
public class AdminFilter implements Filter {
...
/**
* TODO doFilter方法,专门用于拦截请求,做过滤响应。
* @param request 请求
* @param response 响应
* @param chain 过滤链
* @throws IOException io异常
* @throws ServletException servlet异常
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//强制转换HttpServletRequest
HttpServletRequest req = (HttpServletRequest)request;
//获取session
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}else {
// 让程序继续往下访问用户的目标资源
chain.doFilter(request, response);
}
}
...
}
web.xml配置文件
AdminFilter
com.atguigu.filter.AdminFilter
AdminFilter
/admin/*
Filter 过滤器的使用步骤:
- 步骤一,编写一个类去实现 Filter 接口
- 步骤二,实现过滤方法 doFilter()
- 步骤三,到 web.xml 中去配置 Filter 的拦截路径
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录页面
这是登录页面。login.jsp 页面
LoginServlet 程序
package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author 白村客
* @version 1.0
* @date 2022-05-31 15:21
* TODO 登录应用程序
*/
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//避免响应乱码
resp.setContentType("text/html; charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("zhangsan".equals(username) && "123456".equals(password)) {
req.getSession().setAttribute("user", username);
resp.getWriter().write("登录 成功!!!");
} else {
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
}
浏览器会将图片等资源放入缓存中,以便快速访问。但在实际开发中,都需要清空缓存。两种清空缓存的方法:
①手动清除浏览器缓存。
②给缓存中变量名加一个唯一标识,常加时间戳,如购物车中“添加购物车”功能的跳转。
Filter 的生命周期包含几个方法
- ①构造器方法
- ②init 初始化方法
①以及②,在 web 工程启动的时候执行(Filter 已经创建)
- ③doFilter 过滤方法 (每次拦截到请求,就会执行)
- ④destroy 销毁
停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)
FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。FilterConfig 类的作用是获取 filter 过滤器的配置内容1、获取 Filter 的名称 filter-name 的内容2、获取在 Filter 中配置的 init-param 初始化参数3、获取 ServletContext 对象
java代码
/**
* TODO 初始化方法
*
* @param filterConfig filter配置信息
* @throws ServletException servlet异常
*/
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
// 1、获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
// 2、获取在 web.xml 中配置的 init-param 初始化参数
System.out.println("初始化参数 username 的值是:" + filterConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是:" + filterConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(filterConfig.getServletContext());
}
web.xml配置
FilterConfig
com.atguigu.filter.AdminFilterConfig
username
zhangsan
url
jdbc:mysql://localhost3306/test
- Filter 过滤器
- Chain 链,链条
- FilterChain 就是过滤器链(多个过滤器如何一起工作)
注意
- doFilter()被去除后,将不会执行目标资源。
- 当Filter1中的chain.doFilter()被去除后,其输出结果为“前置代码1-前置代码2”。
- 当Filter2中的chain.doFilter()被去除后。其结果是“前置代码1-前置代码1-后置代码2-前后置代码”,但是目标资源将不会显示。
-- 精确匹配< url-pattern >/target.jsp url-pattern >以上配置的路径,表示请求地址必须为: http://ip:port/ 工程路径 /target.jsp
-- 目录匹配< url-pattern >/admin/* url-pattern >以上配置的路径,表示请求地址必须为: http://ip:port/ 工程路径 /admin/*
-- 后缀名匹配< url-pattern >*.html url-pattern >以上配置的路径,表示请求地址必须以 .html 结尾才会拦截到< url-pattern >*.do url-pattern >以上配置的路径,表示请求地址必须以 .do 结尾才会拦截到< url-pattern >*.action url-pattern >以上配置的路径,表示请求地址必须以 .action 结尾才会拦截到
注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!
摘自:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版_哔哩哔哩_bilibili0基础如何学起?宋红康30天搞定Java核心:BV1Kb411W75N一键三连呀【点赞、投币、收藏】呀~本视频涵盖核心技术点有:Servlet程序、Filter过滤器、Listener监听器、jsp页面、EL表达式、JSTL标签库、jQuery框架、Cookie技术、Session会话、JSON使用、Ajax请求,并在讲解知识点过程中会带领大家完成一个书城项目。相对于旧版,本版本使用idea进行开https://www.bilibili.com/video/BV1Y7411K7zz?p=293