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

本文介绍Java Filter的工作原理,重点讲解LogCostFilter示例,演示如何通过Filter实现URL权限控制和性能监控,包括doFilter方法的调用流程和CharacterEncodingFilter的编码过滤功能。
摘要由CSDN通过智能技术生成

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值