文章目录
Filter作用
- 拦截请求,过滤响应
Filter使用
1.编写Filter接口实现类
package com.pang.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author pangjian
* @ClassName MyFilter
* @Description TODO
* @date 2021/4/12 17:26
*/
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpservletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpservletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于null,说明还没有登录
if(user == null){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
} else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
2.配置Filter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<!--给filter程序起一个别名(一般是类名)-->
<filter-name>MyFilter</filter-name>
<!--是filter程序全类名,-->
<filter-class>com.pang.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<!--映射-->
<filter-name>MyFilter</filter-name>
<!--配置访问地址
/ : 表示地址为http://ip:port/工程路径/ 映射到IDEA 的webapp目录下
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
</web-app>
Filter生命周期
- 1、构造器方法
- 2、init初始化方法
第1,2步,在web工程启动的时候执行( Filter已经创建)
- 3、doFilter过滤方法
第3步,每次拦截到请求,就会执行
- 4、destroy销毁
第4步,停止 web工程的时候,就会执行(停止 web工程,也会销毁Filter过滤器)
FilterConfig接口
作用
1、获取Filter 的名称 filter-name 的内容
2、获取在Filter 中配置的init-param初始化参数
3、获取ServletContext对象
System.out.println(filterConfig.getFilterName());
System.out.println(filterConfig.getInitParameter("username"));
System.out.println(filterConfig.getServletContext());
FilterChain接口(过滤器链)
如果有权限的执行顺序
FilterChain.doFilter()方法的作用
如果有Filter则执行下一个Filter过滤器,没有Filter则访问目标资源
在多个Filter过滤器执行的时候,它们执行的优先顺序是由他们在web.xml中从上到下配置的顺序决定!!!