搜索
首页
笔记
案例
关于
课程列表
JavaWeb
Tomcat安装、部署等操作
Servlet
JSP
EL表达式与JSTL标签库
文件上传与下载
cookie与session
Filter过滤器
Listener监听器
ThreadLocal
Gson
课程导航
计算机基础知识
C
Linux
linux常用软件
计算机网络
程序员修养
设计模式
工具
Git
composer
vim
IntelliJ IDEA
wireshark
laravel
Spring
SpringMVC
Maven
数据库
MySQL
Redis
MongoDB
JDBC
Mybatis
MyBatis-Plus
服务端编程
PHP
Java
shell script
JavaWeb
HTML / CSS
HTML
CSS
HTML5
CSS3
BOOTSTRAP
JavaScript
JavaScript
JQuery
layui
cookie与session
Listener监听器
Filter过滤器
Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器。Filter 过滤器它是 JavaEE 的规范,也就是接口。它的作用是:拦截请求,过滤响应。 拦截请求常见的应用场景有:权限检查、日记操作、事务管理、过滤参数……等等 ## 一、Filter 过滤器的使用步骤 1、编写一个类去实现 Filter 接口 2、实现过滤方法 doFilter() 3、到 web.xml 中去配置 Filter 的拦截路径 下面来演示使用filter过滤器实现登录校验功能。 web目录如图: ![](http://img.1024phper.com/blog21032610053086726) 要求是:当访问admin目录下得任意资源,必须是已经登录过后的状态才可以访问,否则跳到登录页。 首先编写一个类AuthFilter实现Filter接口,实现该接口。 ```java package com.javaweb.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class AuthFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpSession session = req.getSession(); if (null == session.getAttribute("user")) { // 登录校验失败 HttpServletResponse resp = (HttpServletResponse) servletResponse; String contextPath = req.getContextPath(); resp.sendRedirect(contextPath + "/login.jsp"); } else { // 校验通过 filterChain.doFilter(servletRequest, servletResponse); } } @Override public void destroy() { } } ``` web.xml中关于filter的配置如下: ```xml
AuthFilter
com.javaweb.filter.AuthFilter
AuthFilter
/admin/*
``` 至此,一个权限校验的拦截器就完成了。 ## 二、Filter 的生命周期 Filter 的生命周期包含几个方法 1、构造器方法 2、init 初始化方法 第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建) 3、doFilter 过滤方法 第 3 步,每次拦截到请求,就会执行 4、destroy 销毁 第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器) ## 三、FilterConfig 类 FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。 Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。 FilterConfig 类的作用是获取 filter 过滤器的配置内容 1. 获取 Filter 的名称 filter-name 的内容 2. 获取在 Filter 中配置的 init-param 初始化参数 3. 获取 ServletContext 对象 ## 四、FilterChain 过滤器链 FilterChain 的作用是让多个过滤器可以对同一个请求进行过滤。可以同时设置多个过滤器,它们之间的执行顺序是由web.xml中的配置顺序决定的。 技术关键点是`filterChain.doFilter(servletRequest, servletResponse);`, ![](http://img.1024phper.com/blog21032610534785529) 多个Filter过滤器执行的特点: * 多个filter和目标资源默认都在同一线程中执行 * 多个filter共同执行的时候,它们公用一个Request对象。 下面,来完成一个多个filter案例。使用两个过滤器 * 第一个过滤器用于日志记录,对整个工程路径都起作用 * 第二个过滤器进行权限校验,只对工程路径下得/admin路径起作用 web.xml配置信息如下 ```xml
LogFilter
com.javaweb.filter.LogFilter
LogFilter
/*
AuthFilter
com.javaweb.filter.AuthFilter
AuthFilter
/admin/*
``` LogFilter代码如下: ```java @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 日志记录,这里就用打印请求路径代替 HttpServletRequest req = (HttpServletRequest) servletRequest; System.out.println(req.getRequestURL()); filterChain.doFilter(servletRequest, servletResponse); } ``` Authfilter代码如下: ```java public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpSession session = req.getSession(); if (null == session.getAttribute("user")) { // 登录校验失败 HttpServletResponse resp = (HttpServletResponse) servletResponse; String contextPath = req.getContextPath(); resp.sendRedirect(contextPath + "/login.jsp"); } else { // 校验通过 filterChain.doFilter(servletRequest, servletResponse); } } ``` ## 五、Filter拦截路径语法 **精确匹配** ```
/target.jsp
``` 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp --目录匹配 **目录匹配** ```
/admin/*
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/* ``` **后缀名匹配** ```
*.html
``` 以上配置的路径,表示请求地址必须以.html 结尾才会拦截到 ```
*.do
``` 以上配置的路径,表示请求地址必须以.do 结尾才会拦截到 ```
*.action
``` 以上配置的路径,表示请求地址必须以.action 结尾才会拦截到 **Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在**
cookie与session
Listener监听器
文章目录