日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java过滤器的原理_Java 三大器之过滤器(Filter)工作原理

發布時間:2023/12/10 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java过滤器的原理_Java 三大器之过滤器(Filter)工作原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Filter 簡介

filter稱為過濾器,可以對web 服務器管理的所有資源: Jsp, Servlet,靜態圖片文件或靜態html文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制,過濾敏感詞匯,壓縮響應信息等高級功能。

public class LogCostFilter implements Filter {

public abstract void init(FilterConfig paramFilterConfig) throws ServletException;

public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain

paramFilterChain) throws IOException, ServletException;

public abstract void destroy();

}

工作原理

doFilter方法中,配置對哪個web 資源進行攔截后,WEB服務器每次在調用web資源service方法之前,都會先調用一下filter的doFilter方法,因此,在該方法內編寫代碼可以達到此目的:

調用目標資源之前,讓一段代碼執行

是否調用目標資源(即是否讓用戶訪問web 資源)

調用目標資源之后,讓一段代碼執行(filterChian)

Demo

LogCostFilter

public class LogCostFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("---Filter初始化---");

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

servletRequest.setCharacterEncoding("UTF-8");

servletResponse.setContentType("text/html;charset=UTF-8");

long start = System.currentTimeMillis();

System.out.println("---調用service之前執行的一段代碼---");

filterChain.doFilter(servletRequest, servletResponse);

System.out.println("Execute cost="+(System.currentTimeMillis()-start));

}

@Override

public void destroy() {

System.out.println("---Filter銷毀---");

}

}

FilterConfig

@Configuration

public class FilterConfig {

@Bean

public FilterRegistrationBean registFilter() {

FilterRegistrationBean registrationBean = new FilterRegistrationBean();

registrationBean.setFilter(new LogCostFilter());

registrationBean.addUrlPatterns("/*");

registrationBean.setName("LogCostFilter");

registrationBean.setOrder(1);

return registrationBean;

}

}

過濾字符串標準代碼

public class CharacterEncodingFilter extends OncePerRequestFilter{

private static final boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(

HttpServletResponse.class, "setCharacterEncoding", new Class[] { String.class });

// 需要設置的編碼方式,為了支持可配置,Spring把編碼方式設置成了一個變量

private String encoding;

// 是否強制使用統一編碼,也是為了支持可配置

private boolean forceEncoding;

// 構造器,在這里,Spring把forceEncoding的值默認設置成了false

public CharacterEncodingFilter(){

this.forceEncoding = false;

}

// encoding/forceEncoding的setter方法

public void setEncoding(String encoding){

this.encoding = encoding;

}

public void setForceEncoding(boolean forceEncoding){

this.forceEncoding = forceEncoding;

}

// Spring通過GenericFilterBean抽象類,對Filter接口進行了整合,

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

throws ServletException, IOException{

if ((this.encoding != null) && (((this.forceEncoding) || (request.getCharacterEncoding() == null)))) {

request.setCharacterEncoding(this.encoding);

if ((this.forceEncoding) && (responseSetCharacterEncodingAvailable)) {

response.setCharacterEncoding(this.encoding);

}

}

filterChain.doFilter(request, response);

}

}

總結

以上是生活随笔為你收集整理的java过滤器的原理_Java 三大器之过滤器(Filter)工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。