SpringBoot學習-(十一)SpringBoot過濾器
阿新 • • 發佈:2019-01-29
兩種加入spring ioc容器的方法
- 在過濾器上面新增@Component註解
- 在springboot啟動類上面新增@ServletComponentScan註解(Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 註解自動註冊,無需其他程式碼)
1.目錄結構
2.編寫過濾器
package com.ahut.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.stereotype.Component;
/**
*
* @ClassName: MyFilter
* @Description:自定義過濾器
* @author cheng
* @date 2017年9月26日 上午9:19:38
*/
// 加入spring ioc容器
@Component
/*
* @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器
* 屬性filterName宣告過濾器的名稱,可選
* 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
*/
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {
/**
* 執行過濾操作
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
System.out.println("執行過濾操作。。。");
}
/**
* 過濾器初始化
*/
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("過濾器初始化。。。");
}
/**
* 過濾器銷燬
*/
@Override
public void destroy() {
System.out.println("過濾器銷燬。。。");
}
}
注意:過濾器在伺服器啟動時初始化,伺服器關閉時銷燬!!!
3.多個過濾器執行的順序問題
目錄結構:
過濾器程式碼:
package com.ahut.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.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
*
* @ClassName: MyFilter
* @Description:自定義過濾器
* @author cheng
* @date 2017年9月26日 上午9:19:38
*/
// 加入spring ioc容器
@Component
/*
* @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器
* 屬性filterName宣告過濾器的名稱,可選
* 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
*/
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
//指定過濾器的執行順序,值越小越靠後執行
@Order(1)
public class MyFilter implements Filter {
/**
* 執行過濾操作
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
System.out.println("執行過濾操作。。。111");
}
/**
* 過濾器初始化
*/
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("過濾器初始化。。。111");
}
/**
* 過濾器銷燬
*/
@Override
public void destroy() {
System.out.println("過濾器銷燬。。。111");
}
}
package com.ahut.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.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
*
* @ClassName: MyFilter2
* @Description:自定義過濾器
* @author cheng
* @date 2017年9月26日 上午9:19:38
*/
// 加入spring ioc容器
@Component
/*
* @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器
* 屬性filterName宣告過濾器的名稱,可選
* 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
*/
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
//指定過濾器的執行順序,值越大越先執行
@Order(2)
public class MyFilter2 implements Filter {
/**
* 執行過濾操作
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
System.out.println("執行過濾操作。。。222");
}
/**
* 過濾器初始化
*/
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("過濾器初始化。。。222");
}
/**
* 過濾器銷燬
*/
@Override
public void destroy() {
System.out.println("過濾器銷燬。。。222");
}
}
執行結果:
過濾器初始化。。。222
過濾器初始化。。。111
執行過濾操作。。。222
執行過濾操作。。。111
過濾器銷燬。。。222
過濾器銷燬。。。111
結論:
通過@Order(i)註解可以控制過濾器的執行順序
i的值越小,過濾器越靠後執行
i的值越大,過濾器越先執行
2018.9.4日新增
使用java配置方式註冊過濾器FilterRegistrationBean
過濾器
package com.ahut.essearch.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import java.io.IOException;
/**
* desc : 關鍵詞處理過濾器
* create_user : cheng
* create_date : 2018/9/4 18:56
*/
public class KeywordHandleFilter implements Filter {
/**
* 日誌列印
*/
private Logger log = LoggerFactory.getLogger(KeywordHandleFilter.class);
/**
* desc : 初始化
* create_user : cheng
* create_date : 2018/9/4 19:01
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("KeywordHandleFilter初始化");
}
/**
* desc : 對關鍵詞進行處理
* create_user : cheng
* create_date : 2018/9/4 19:01
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("KeywordHandleFilter執行過濾操作");
chain.doFilter(request, response);
}
/**
* desc : 銷燬
* create_user : cheng
* create_date : 2018/9/4 19:01
*/
@Override
public void destroy() {
log.info("KeywordHandleFilter銷毀");
}
}
java配置
package com.ahut.essearch.config;
import com.ahut.common.constant.SystemConst;
import com.ahut.essearch.filter.KeywordHandleFilter;
import com.ahut.essearch.filter.KeywordValidateFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import java.util.ArrayList;
import java.util.List;
/**
* desc : 過濾器配置
* create_user : cheng
* create_date : 2018/9/4 18:36
*/
@Configuration
public class FilterConfig {
/**
* 日誌列印
*/
private Logger log = LoggerFactory.getLogger(FilterConfig.class);
/**
* desc : 註冊關鍵詞處理過濾器
* create_user : cheng
* create_date : 2018/9/4 19:04
*/
@Bean
public FilterRegistrationBean registerKeywordHandleFilter () {
FilterRegistrationBean filterBean = new FilterRegistrationBean();
KeywordHandleFilter keywordHandleFilter = new KeywordHandleFilter();
// 設定過濾器名稱, 執行順序, 攔截url
String filterName = keywordHandleFilter.getClass().getSimpleName();
int order = 3;
List<String> urlPatterns = new ArrayList<>(1);
urlPatterns.add("/v1/query/keyword");
filterBean.setFilter(keywordHandleFilter);
filterBean.setName(filterName);
filterBean.setOrder(order);
filterBean.setUrlPatterns(urlPatterns);
log.info(String.format("註冊過濾器, 過濾器name: %s, 過濾器order: %d, 過濾器過濾url: %s", filterName, order, urlPatterns));
return filterBean;
}
}
注意:registrationBean.setOrder(1)是設定該過濾器執行的順序。SpringBoot會根據order從小到大的順序執行。