概述
Filter 过滤器
- 介绍
- 实现
- Filter 的生命周期
- FilterConfig 类
- FilterChain 类
- Filter 的拦截路径
介绍
- Filter 过滤器是 JavaWeb 三大组件之一,三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
- Filter 过滤器是 JavaEE 的规范,也就是接口
- Filter 过滤器作用是:拦截请求,过滤响应
实现
步骤:
- 编写一个类实现 Filter 接口
- 实现 doFilter() 方法
- 在 web.xml 中配置 Filter 的拦截路径
每个 Filter 过滤器会拦截访问指定目录下资源的请求,可以在拦截时进行权限检查等操作。
需求:
admin 文件夹下的 1.jpg,只有登录的用户才可以访问,编写 Filter 程序,拦截所有访问 1.jpg 的请求,只有登录的用户才放开请求,未登录的用户强制跳转到登录页面。
判断用户是否登录:
用户登录成功后,会把用户的登录信息保存到 Session 域中,因此,要检查用户是否登录,可以判断 Session 中是否保存了用户的登录信息即可。
在地址栏输入:http://localhost:8080/Filter/admin/1.jpg
AdminFilter.java
package myFilter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class AdminFilter implements Filter{
/**
* doFilter方法,专门用于拦截请求,可以做权限检查
*/
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)arg0;
Object userInfo = req.getSession().getAttribute("userInfo");
//userInfo为空代表没有登录,不能访问admin文件夹下的文件
if(userInfo==null) {
//返回首页
req.getRequestDispatcher("/login.jsp").forward(arg0, arg1);
} else {
//已经登录,放开拦截,可以访问admin下的文件
arg2.doFilter(arg0, arg1);
}
}
}
配置 AdminFilter 要拦截的路径
web.xml
<!-- 配置AdminFilter -->
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>myFilter.AdminFilter</filter-class>
</filter>
<!--filter-mapping 配置 Filter 过滤器要拦截的路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!--url-pattern 配置拦截路径
/ 表示请求地址为:http://ip:port/工程路径/ 映射到工程的 web 目录
/admin/* 表示请求地址为:http://ip:port/工程路径/admin/*,其中*表示该文件夹下的全部文件
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
登录页面
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8080/Filter/loginServlet" method="get">
用户名:<input type="text" name="username"/> <br>
密 码:<input type="password" name="password"/> <br>
<input type="submit" />
</form>
</body>
</html>
LoginServlet 接收登录请求
LoginServlet.java
package myServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@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("admin".equals(username) && "admin".equals(password)) {
req.getSession().setAttribute("userInfo", username);
resp.getWriter().write("登录成功");
} else {
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
}
配置 LoginServlet 的访问路径
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>myServlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
Filter 的生命周期
Filter 的生命周期包含以下几个方法:
- 构造器方法
- init() 初始化方法
第 1,2 步,在 web 工程启动时执行(Filter 已经创建) - doFilter() 方法
第 3 步,每次拦截到请求,就会执行 - destroy() 销毁
第 4 步,web 工程停止时,就会执行(停止 web 工程,也会销毁 Filter 过滤器)
FilterConfig 类
FilterConfig 类,是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 时,会同时创建一个 FilterConfig 类,类内包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用:
- 获取 Filter 的名称,即 filter-name 的内容
- 获取 web.xml 中配置的 init-param 初始化参数
- 获取 ServletContext 对象
web.xml
<!-- 配置AdminFilter -->
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>myFilter.AdminFilter</filter-class>
<!-- 配置初始化参数 -->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/test</param-value>
</init-param>
</filter>
<!--filter-mapping 配置 Filter 过滤器要拦截的路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!--url-pattern 配置拦截路径
/ 表示请求地址为:http://ip:port/工程路径/ 映射到工程的 web 目录
/admin/* 表示请求地址为:http://ip:port/工程路径/admin/*,其中*表示该文件夹下的全部文件
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//FilterConfig 类的作用是获取 filter 过滤器的配置内容
//1、获取 Filter 的名称,即 filter-name 的内容
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
//2、获取在 Filter 中配置的 init-param 初始化参数
String username = filterConfig.getInitParameter("username");
System.out.println(username);
//3、获取 ServletContext 对象
ServletContext servletContext = filterConfig.getServletContext();
System.out.println(servletContext);
}
FilterChain 类
FilterChain 类,是过滤器链,即多个过滤器如何一起工作。
多个 Filter 执行时的特点:
- 所有 Filter 和目标资源默认在同一线程内。
- 多个 Filter 共同执行时,使用同一个 Request 对象。
- 多个 Filter 共同执行时,执行顺序由 web.xml 中配置的由上到下的顺序决定。
Filter 的拦截路径
- 精确匹配
<url-pattern>/target.jsp</url-pattern>
表示请求地址为:http://ip:port/工程路径/target.jsp 时,发生拦截。 - 目录匹配
<url-pattern>/admin/*</url-pattern>
表示请求地址为:http://ip:port/工程路径/admin/下的所有资源 时,发生拦截。 - 后缀名匹配
<url-pattern>*.xyz</url-pattern>
表示请求地址以 .xyz 结尾时,发生拦截。
Filter 过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在,即使资源不存在,但地址匹配,也会发生拦截。
最后
以上就是高挑水杯为你收集整理的JavaWeb学习笔记——Filter过滤器介绍实现Filter 的生命周期FilterConfig 类FilterChain 类Filter 的拦截路径的全部内容,希望文章能够帮你解决JavaWeb学习笔记——Filter过滤器介绍实现Filter 的生命周期FilterConfig 类FilterChain 类Filter 的拦截路径所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复