Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
實現Filter的幾種方法
問題點:如何應用過濾器?實現過濾器有哪些方法?
過濾器的作用:在javaweb的中過濾器的主要作用是過濾指定路徑格式的接口,在請求前后做處理,既可以更改請求頭也可以更改請求的返回值。
應用場景:改變請求頭信息、添加新的請求頭內容、判斷來自客戶端的內容是否存在非法信息等等!
實現過濾器的幾種常見的方式:
// 實現Filter接口
@Component // 通過Component注解讓Spring容器自動為我們創建實例
public class MyFilter implements Filter {
// 銷毀過濾器時調用的方法(默認不用實現)
@Override
public void destroy() {
Filter.super.destroy();
}
// 初始化方法(默認不用實現該方法)
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 請求接口前操作
// 調用接口方法前需要執行的代碼
filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個過濾器
// 請求接口后操作
// 調用接口方法后需要執行的代碼
}
}
上述方式一的實現比較簡單,但是這種方式有一個缺陷(漏洞);大家請注意上面的過濾器對象是由注解自動配置并創建的,這樣就是默認值**“/*”**,所以過濾范圍是所有接口。
基于方式一的漏洞問題做了如下的改動:
// 實現Filter接口
public class MyFilter implements Filter {
// 銷毀過濾器時調用的方法(默認不用實現)
@Override

public void destroy() {
Filter.super.destroy();
}
// 初始化方法(默認不用實現該方法)
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 請求接口前操作
// 調用接口方法前需要執行的代碼
filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個過濾器
// 請求接口后操作
// 調用接口方法后需要執行的代碼
}
}
上述的實現與方式一基本相同,唯一不同的地方就是沒有通過@注解進行注入容器。
配置過濾器通過@Bean的方式:
@Configuration
public class MyFilterRegistration {
@Bean
public FilterRegistrationBean<MyFilter> registrationBean(){
// 創建FilterRegistrationBean,通過它配置過濾器
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter()); // 設置過濾器
registrationBean.addUrlPatterns("/device/*"); // 設置過濾器生效范圍
registrationBean.setName("myFilter"); // 過濾器名稱
registrationBean.setOrder(1); // 設置優先級
return registrationBean;
}
}
方式二是實現Filter接口,并通過自定義配置類的方式將自定義的Filter實現注入到Spring容器。
通過@注解實現:
// 實現Filter接口,通過WebFilter可以配置過濾范圍、name等參數
@WebFilter(value = "/device/*",filterName = "myFilter",displayName = "thisIsFilter")
public class MyFilter implements Filter {
// 銷毀過濾器時調用的方法(默認不用實現)
@Override
public void destroy() {
Filter.super.destroy();
}
// 初始化方法(默認不用實現該方法)
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 請求接口前操作
// 調用接口方法前需要執行的代碼
filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個過濾器
// 請求接口后操作
// 調用接口方法后需要執行的代碼
}
}
注意點:通過@實現的時候還需要做一件事,否則@不生效;
@ServletComponentScan // 如果不標準該注解方式三將不會生效
public class DisplayCoreApplication {
public static void main(String[] args) {
SpringApplication.run(DisplayCoreApplication.class, args);
}
}
總結:以上就是幾種實現過濾器的方式,個人比較推薦方式二,因為這樣可以將所有的自定義過濾器統一通過一個配置類注入到容器,后期查看時也是一目了然!當然方式三更加的簡潔,視情況而定吧。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。