springboot过滤器Filter

原创 Laughing  2019-07-26 11:23  阅读 43 次 评论 0 条

单个过滤器

如果只是定义一个过滤器,直接通过@Configuration注解即可。

  1. package Net.XiangCaoWuYu.Configurations;  
  2.   
  3.   
  4. import org.slf4j.Logger;  
  5. import org.slf4j.LoggerFactory;  
  6. import org.springframework.context.annotation.Configuration;  
  7.   
  8. import javax.servlet.*;  
  9. import javax.servlet.annotation.WebFilter;  
  10. import java.io.IOException;  
  11.   
  12. /** 
  13.  * ClassName: CustomFilter <br/> 
  14.  * Description: <br/> 
  15.  * date: 2019/7/25 22:04<br/> 
  16.  * 
  17.  * @author lisen01<br /> 
  18.  * @since JDK 1.8 
  19.  */  
  20. @WebFilter(filterName = "CustomFilter", urlPatterns = "{/*}")  
  21. public class CustomFilter implements Filter {  
  22.     private Logger logger = LoggerFactory.getLogger(this.getClass());  
  23.   
  24.     /**  
  25.      * Called by the web container to indicate to a filter that it is being  
  26.      * placed into service. The servlet container calls the init method exactly  
  27.      * once after instantiating the filter. The init method must complete  
  28.      * successfully before the filter is asked to do any filtering work.  
  29.      * <p>  
  30.      * The web container cannot place the filter into service if the init method  
  31.      * either:  
  32.      * <ul>  
  33.      * <li>Throws a ServletException</li>  
  34.      * <li>Does not return within a time period defined by the web  
  35.      * container</li>  
  36.      * </ul>  
  37.      *  
  38.      * @param filterConfig The configuration information associated with the  
  39.      *                     filter instance being initialised  
  40.      * @throws ServletException if the initialisation fails  
  41.      */  
  42.     @Override  
  43.     public void init(FilterConfig filterConfig) throws ServletException {  
  44.         logger.info("初始化过滤器CustomFilter");  
  45.     }  
  46.   
  47.     /** 
  48.      * The <code>doFilter</code> method of the Filter is called by the container 
  49.      * each time a request/response pair is passed through the chain due to a 
  50.      * client request for a resource at the end of the chain. The FilterChain 
  51.      * passed in to this method allows the Filter to pass on the request and 
  52.      * response to the next entity in the chain. 
  53.      * <p> 
  54.      * A typical implementation of this method would follow the following 
  55.      * pattern:- <br> 
  56.      * 1. Examine the request<br> 
  57.      * 2. Optionally wrap the request object with a custom implementation to 
  58.      * filter content or headers for input filtering <br> 
  59.      * 3. Optionally wrap the response object with a custom implementation to 
  60.      * filter content or headers for output filtering <br> 
  61.      * 4. a) <strong>Either</strong> invoke the next entity in the chain using 
  62.      * the FilterChain object (<code>chain.doFilter()</code>), <br> 
  63.      * 4. b) <strong>or</strong> not pass on the request/response pair to the 
  64.      * next entity in the filter chain to block the request processing<br> 
  65.      * 5. Directly set headers on the response after invocation of the next 
  66.      * entity in the filter chain. 
  67.      * 
  68.      * @param request  The request to process 
  69.      * @param response The response associated with the request 
  70.      * @param chain    Provides access to the next filter in the chain for this 
  71.      *                 filter to pass the request and response to for further 
  72.      *                 processing 
  73.      * @throws IOException      if an I/O error occurs during this filter's 
  74.      *                          processing of the request 
  75.      * @throws ServletException if the processing fails for any other reason 
  76.      */  
  77.     @Override  
  78.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
  79.         logger.info("过滤器CustomFilter开始工作,并转入下一个过滤");  
  80.         chain.doFilter(request, response);  
  81.         logger.info("CustomFilter继续过滤");  
  82.     }  
  83.   
  84.     /** 
  85.      * Called by the web container to indicate to a filter that it is being 
  86.      * taken out of service. This method is only called once all threads within 
  87.      * the filter's doFilter method have exited or after a timeout period has 
  88.      * passed. After the web container calls this method, it will not call the 
  89.      * doFilter method again on this instance of the filter. <br> 
  90.      * <br> 
  91.      * <p> 
  92.      * This method gives the filter an opportunity to clean up any resources 
  93.      * that are being held (for example, memory, file handles, threads) and make 
  94.      * sure that any persistent state is synchronized with the filter's current 
  95.      * state in memory. 
  96.      */  
  97.     @Override  
  98.     public void destroy() {  
  99.         logger.info("过滤器CustomFilter销毁");  
  100.     }  
  101. }  

多个过滤器

如果定义多个过滤器,需要通过FilterRegistrationBean提供setOrder方法,可以为filter设置排序值,让spring在注册web filter之前排序后再依次注册。启动类中利用@bean注册FilterRegistrationBean

温馨提示

过滤器定义与上面类似,去掉@Configuration注解即可

,这里不再赘述,然后修改启动类,增加以下代码

  1. /* 
  2.  *     Copyright (C) 2019  木子网https://www.lisen.me 
  3.  *     项目名称:Net.XiangCaoWuYu.Idea 
  4.  *     文件名称:App.java 
  5.  *     Date:19-7-19 上午1:21 
  6.  *     Author:lisen@lisen.me 
  7.  *     This program is free software: you can redistribute it and/or modify 
  8.  *     it under the terms of the GNU General Public License as published by 
  9.  *     the Free Software Foundation, either version 3 of the License, or 
  10.  *     (at your option) any later version. 
  11.  * 
  12.  *     This program is distributed in the hope that it will be useful, 
  13.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  15.  *     GNU General Public License for more details. 
  16.  * 
  17.  *     You should have received a copy of the GNU General Public License 
  18.  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. 
  19.  */  
  20.   
  21. package Net.XiangCaoWuYu;  
  22.   
  23. import Net.XiangCaoWuYu.Configurations.CustomFilter;  
  24. import Net.XiangCaoWuYu.Configurations.CustomFilterOther;  
  25. import org.slf4j.Logger;  
  26. import org.slf4j.LoggerFactory;  
  27. import org.springframework.boot.SpringApplication;  
  28. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  29. import org.springframework.boot.autoconfigure.domain.EntityScan;  
  30. import org.springframework.boot.web.servlet.FilterRegistrationBean;  
  31. import org.springframework.context.annotation.Bean;  
  32. import org.springframework.context.annotation.ComponentScan;  
  33. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  
  34.   
  35.   
  36. @SpringBootApplication  
  37. //SpringBoot 默认从App类往下面的包扫描  
  38. //所以如果控制器、实体等类与App不在一个包,同时不在下面的包时,必须手动指定包  
  39. //@ComponentScan(basePackages = {"Net.XiangCaoWuYu.Controllers", "Net.XiangCaoWuYu.Services"})  
  40. @EnableJpaRepositories(basePackages = {"Net.XiangCaoWuYu.Repositories""Net.XiangCaoWuYu.Services"})  
  41. //@EntityScan(basePackages = {"Net/XiangCaoWuYu/Pojos"})  
  42. public class App {  
  43.   
  44.     private static final Logger logger = LoggerFactory.getLogger(App.class);  
  45.   
  46.     public static void main(String[] args) {  
  47. //        System.setProperty("log.root","DEBUG,info,error");  
  48. //  
  49. //        System.setProperty("log.base","D:\\log4j\\base");  
  50.         SpringApplication.run(App.class, args);  
  51.     }  
  52.   
  53.     @Bean  
  54.     public FilterRegistrationBean filterRegistrationBean() {  
  55.         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();  
  56.         filterRegistrationBean.setFilter(new CustomFilter());  
  57.         filterRegistrationBean.setOrder(10);  
  58.         return filterRegistrationBean;  
  59.     }  
  60.   
  61.     @Bean  
  62.     public FilterRegistrationBean filterRegistrationBeanOther() {  
  63.         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();  
  64.         filterRegistrationBean.setFilter(new CustomFilterOther());  
  65.         filterRegistrationBean.setOrder(20);  
  66.         return filterRegistrationBean;  
  67.     }  
  68. }  

历史上的今天:

本文地址:https://www.lisen.me/springboot-filter.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情