您的当前位置:首页JavaEE三大器(1)-过滤器
JavaEE三大器(1)-过滤器
来源:锐游网
Filter简介
Filter即过滤器是JavaEE中一项重要的技术,主要用于管理JavaEE中的资源访问,例如:接口、html文件、jsp文件、静态资源文件等。
如何自定义Filter?
当使用springMVC时,首先需在web.xml文件中配置Filter。例子如下:
<!--配置过滤器-->
<filter>
<filter-name>filterConfig</filter-name>
<filter-class>com.hhy.test.FilterConfig</filter-class>
</filter>
<!--映射过滤器-->
<filter-mapping>
<filter-name>filterConfig</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
配置项说明:
<filter>中配置项:
<filter-name>:过滤器的名称
<filter-class>:该过滤器对应的配置类
<inti-param>:初始化参数
<param-name>:参数名称
<param-value>:参数值
<filter-mapping>中配置项:
<filter-name>:过滤器名称,和<filter>中的<filter-name>相同
<url-pattern>:过滤器过滤的资源路径
<dispatcher>:指定过滤器过滤的资源的调用方式,默认为REQUEST
dispatcher取值和意义:
- REQUEST:如果资源的调用方式是RequestDispatcher的forward()或include(),那么该资源路径即使匹配,过滤器也不会起作用
- FORWARD:调用方式是RequestDispatcher的forward()起作用
- INCLUDE:调用方式是RequestDispatcher的include()起作用
- ERROR:如果该资源适配异常处理机制调用,则该过滤器起作用
其次要定义java.servlet.Filter接口的实现类,并重写其中的三个抽象方法。如下:
public class FilterConfig implements Filter {
/**
* servlet容器创建Filter实例时,调用init方法初始化Filter实例,
* 例如:获取Filter的名称等
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
}
/**
* 主要通过doFilter方法实现资源过滤
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("请求之前过滤。。。。。");
chain.doFilter(request,response);
System.out.println("请求之后过滤。。。。。");
}
/**
* servlet容器销毁filter之前调用destroy方法
*/
@Override
public void destroy() {
}
}
- init(FilterConfig config):在servlet容器创建Filter实例时,调用该方法完成Filter实例的初始化,该Filter对象只会创建一次
- doFilter(ServletRequest request,ServletResponse response,FilterChain chain):主要完成对资源的过滤,可在进入接口之前过滤,也可在完成接口操作之后过滤,通过chain.doFilter()区分前后。如果不想让用户进入接口,可不调用chain.doFiltere()方法
- destory():servlet 容器销毁Filter之前调用该方法,可用于资源的释放等
过滤链
web.xml中可定义多个过滤器,过滤器的过滤顺序和web.xml中filter的定义顺序相同。每次调用FilterChain对象的doFilter()方法,servlet容器会检查FilterChain对象中是否还有Filter,如果有接着过滤;如果没有则进入接口操作资源
springboot中使用Filter
在SringBoot中使用Filter要简单一点,如下:
@Order(1)//当有多个Filter时,标识Filter的顺序,数字为正数,越小表示越先过滤
@WebFilter(filterName = "testFilter",urlPatterns = "/login/*")
public class FilterConfig implements Filter {
/**
* servlet容器创建Filter实例时,调用init方法初始化Filter实例,
* 例如:获取Filter的名称等
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
}
/**
* 主要通过doFilter方法实现资源过滤
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("请求之前过滤。。。。。");
chain.doFilter(request,response);
System.out.println("请求之后过滤。。。。。");
}
/**
* servlet容器销毁filter之前调用destroy方法
*/
@Override
public void destroy() {
}
}
其次,在Application.java类中添加注解@ServletComponentScan即可
因篇幅问题不能全部显示,请点此查看更多更全内容