springboot中配置過濾器以及可能出現的問題


  在springboot添加過濾器有兩種方式:

    1、通過創建FilterRegistrationBean的方式(建議使用此種方式,統一管理,且通過注解的方式若不是本地調試,如果在filter中需要增加cookie可能會存在寫不進前端情況)

    2、通過注解@WebFilter的方式

 

  通過創建FilterRegistrationBean的方式創建多個filter以及設置執行順序:

     1、創建兩個實現Filter接口的類TestFilter1 、TestFilter2

package com.aoxun.core.filter;

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;

public class TestFilter1 implements Filter {

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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}

}
package com.aoxun.core.filter;

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;

public class TestFilter2 implements Filter {

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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}

}

    2、創建配置類

      有多個filter就創建多個FilterRegistrationBean ,若需注明filter的執行順序,可通過registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1)配置,值越大,執行順序越靠后

package com.aoxun.config.web;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.aoxun.core.filter.TestFilter1;
import com.aoxun.core.filter.TestFilter2;

/**
 * filter配置
 * @author zcj
 *
 */
@Configuration
public class FilterConfig2 {

    @Bean
    public FilterRegistrationBean companyUrlFilterRegister() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注入過濾器
        registration.setFilter(new TestFilter1());
        //攔截規則
        registration.addUrlPatterns("/*");
        //過濾器名稱
        registration.setName("testFilter1");
        //過濾器順序
        registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
        return registration;
    }
    
    @Bean
    public FilterRegistrationBean outLinkSecurityFilterRegister() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注入過濾器
        registration.setFilter(new TestFilter2());
        //攔截規則
        registration.addUrlPatterns("/*");
        //過濾器名稱
        registration.setName("testFilter2");
        //過濾器順序
        registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1);
        return registration;
    }
    
}

    

    通過注解@WebFilter的方式

     1、在啟動類上增加@ServletComponentScan注解,自動掃描帶有過濾器注解的包

        2、在類上使用@WebFilter    

package com.aoxun.core.filter;

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;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.core.annotation.Order;

@WebFilter(filterName="testFilter1",urlPatterns= {"/*"})
public class TestFilter1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        chain.doFilter(request, response);

    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

   注:經測試,@Order並不能實現過濾器排序功能,在springboot中注解的方式增加過濾器可通過修改過濾器文件名稱的方式排序,如上的過濾器TestFilter1在TestFilter2前。

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM