Java Filter

概念

当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:
一般用于通用的操作,如:登录验证,统一的编码处理,敏感字符的和谐

快速入门

1.定义一个类,实现接口Filter
2.复写方法
3.配置拦截路径
    1. web.xml
    2. 注解
        //放行
    chain.doFilter(request, response);
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter("/*")
/**
 *
 * @author 郑佳杰
 */
public class Qql implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                System.out.println("hello");
                //放行
                chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
       
    }
    
}

一些细节

web.xml配置方式

在web.xml插入这段代码即可使过滤器生效
注释习惯用//

 <filter>
         <filter-name>demo1</filter-name> //随便定义的一个名字
        <filter-class>test.Qql</filter-class> //该名字对应的类位置
    </filter>
    <filter-mapping>
        <filter-name>demo1</filter-name> //和上面定义的名字一致就行
        <url-pattern>/*</url-pattern> //设置要生效路径
    </filter-mapping>

执行流程

例题代码

结果:

所以流程是在访问jsp页面前先执行过滤器代码,之后如果有放行就进入jsp页面。 然后在jsp页面回到过滤器是执行放行下面的代码而不是从头开始。

生命周期

在服务器启动时调用init方法创建对象,在服务器正常关闭时调用destory方法销毁

过滤器配置

1.拦截路径配置:

1.具体资源路径: /index.jsp 只对描述的文件生效
2.目录拦截 : /user/* user文件夹目录下的所有文件都生效
3.后缀名拦截: *.jsp 所有jsp文件都生效
4.都得死: /* 全部生效!

2.拦截方式的配置:资源被访问的方式

1.注解配置:设置dispatcherType属性
      1.REQUEST:默认情况 浏览器直接请求资源(重要)
      2.FORWORD:转发来访问资源(重要)
      3.INCLUDE:包含访问资源
      4.ERROR:错误跳转资源
      5.ASYNC:异步访问
    格式样例:@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
2.web.xml 设置dispatcherType标签

过滤器链(配置多个过滤器)

1.执行顺序?
假设有过滤器1,过滤器2 1在2前
执行顺序为:
过滤器1
过滤器2
资源执行
过滤器2
过滤器1
2.如何知道谁在前?
注解配置:
根据类的字典序排序决定 先谁先执行
web.xml:
先定义的先执行

简单例子

  1. 登录判断,如果访问的界面就是去登录就放行,如果不是就必须去判断用户是否登录了
    注意一些CSS资源也需要去判断,避免被过滤器拦截!
posted @ 2021-03-19 09:54  一个经常掉线的人  阅读(65)  评论(0)    收藏  举报