过滤器是什么?
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
应用场景: 判断用户是否登录、过滤器请求记录日志、身份验证、权限控制等。
简单来说,过滤器就相当于每次发起请求之前进行的一次检验,常常被用于某些需要用户登录才能访问的页面等场景。
例如:我们设定了/user的目录下要求是只有登录后的用户才能访问/user目录下的页面,这个时候,我们就可以设置一个过滤器,过滤器中判断用户的session是否为已经登录状态,如果已经登录了,才可以放行,这样一来,就可以拦截非登录用户访问指定的页面,而导致报错等问题。
过滤器的使用方式
①使用Filter接口 implements Filter
(jakarta.servlet)
②重写doFilter方法,获取传递过来的页面信息。
③进行业务逻辑判断,要是符合条件 filterChain.doFilter(req, response);
放行,将数据传输出去。不符合条件,return,并执行指定业务。
示例代码:
//此处表示对所有页面都进行过滤器处理
//当前页面写了校验用户访问页面发送的get请求数据是否为指定值,如果是指定值就放行,否则输出权限不足。
@WebFilter("/*")
public class AFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Content-type", "text/html;utf-8");
String userName = req.getParameter("userName");
if (!"mfish9".equals(userName)) {
PrintWriter writer = response.getWriter();
writer.print("权限不足");
writer.close();
return;
}
//放行
filterChain.doFilter(req, response);
}
`}
`
拦截器路径配置
1.所有资源拦截:@WebFilter("/*") //这是指访问所有资源的时候都会经过过滤器
静态资源(css/js/mp4)
2.具体资源路z径拦截:@WebFilter("/index.jsp") //这是指访问index.jsp的时候会经过过滤器
3.具体目录拦截:@WebFilter("/fish9/*") //这是指访问fish9目录下的所有资源时会经过过滤器
127.0.0.1:8080/fish9/A
127.0.0.1:8080/fish9/B
4.具体后缀名拦截:@WebFilter("*.jsp") //这时指访问后缀名为.jsp的资源时会经过过滤器
过滤器链
过滤器1执行完毕之后再执行过滤器2
注解配置的Filter, 优先级按照过滤器类名 (字符串)的自然排序
例如:先执行aFilter,在执行bFilter
对指定页面不执行过滤器拦截
只需要在过滤器类里面设置一个变量即可。
//当前的头部设置的是@WebFilter("/*")
`//下面是过滤掉部分的页面不被拦截器拦截
private String[] excludeUrls = new String[]{"/login","/页面路径"};`