Filter过滤器

妖狐艹你老母 2022-05-15 03:20 412阅读 0赞

文章目录

    1. 引言
    1. Filter API
    • 2.1 Filter接口
    1. Filter配置
    1. 示例程序

1. 引言

Filter是过滤Request请求的对象,在用户的请求访问资源前处理ServletRequest以及ServletResponse,他可用于日志记录、加解密、Session检查、图像文件保护等。Filter配置可以通过注解或者部署描述来完成,当需要多个Filter配合并强调顺序时只能通过部署描述符配置。

2. Filter API

Filter相关接口包括Filter、FilterConfig、FilterChain,Filter实现必须继承javax.servlet.Filter接口。

2.1 Filter接口

包含三个生命周期init、doFilter、destroy,servlet容器初始化Filter时,会触发Filter的init方法,FilterConfig实例由Servlet容器传入init方法中。

  1. void init(FilterConfig filterConfig)

Servlet容器每次处理Filter相关资源时,会调用相关Filter实例的doFilter方法

  1. void doFilter(ServletRequest request, Servlet Response, FilterChanin filterChain)

在Filter的doFilter的实现中,最后一行需要调用FilterChain中的doFilter方法

  1. filterChain.doFilter(ServletRequest request, ServletResponse response)

一个资源可能被多个Filter关联到(Filter链条),这时Filter.doFilter()方法将触发Filter链条中下一个Filter。只有在Filter链条中的最后一个Filter里调用FilterChain.doFilter()才会触发处理资源方法,否则Request请求终止。 FilterChain接口只定义了一个方法doFilter用于Filter链条

  1. public interface FilterChain {
  2. /**
  3. * Causes the next filter in the chain to be invoked, or if the calling filter is the last filter
  4. * in the chain, causes the resource at the end of the chain to be invoked.
  5. *
  6. * @param request the request to pass along the chain.
  7. * @param response the response to pass along the chain.
  8. */
  9. public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
  10. }

Filter接口最后一个方法是destroy,在servlet容器要销毁Filter时触发

  1. void destroy();

3. Filter配置

Filter配置需要如下步骤:

  1. 确认哪些资源需要使用这个Filter拦截器
  2. 配置Filter的初始化参数值
  3. 给Filter取一个名称,方便识别

FilterConfig接口允许通过他的getServletContext方法访问ServletContext

  1. ServletContext getServletContext(); //返回ServletContext
  2. java.lang.String getFilterName(); //返回Filter名字
  3. java.util.Enumeration<java.lang.String> getInitParameterNames() //返回初始化参数名
  4. java.lang.String getInitParameter(java.lang.String parameterName)//返回参数

配置方式有两种,一种是@WebFilter注解方法,另一种是通过XML注册方式,以@WebFilter注解为例,下面是可选参数










































属性 描述
asyncSupported Filter是否支持异步操作
description Filter描述
dispatcherTypes Filter生效范围
displayName Filter显示名
filterName Filter名称
initParams Filter初始化参数
urlPatterns Filter生效的URL路径
value Filter生效的URL路径
  1. @WebFilter(filterName = "Security Filter", urlPatterns = "/*",
  2. initParams = {
  3. @WebInitParam(name = "A", value = "1")
  4. @WebInitParam(name = "B", value = "2")
  5. })

4. 示例程序

  1. package config.filter;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.Date;
  7. import javax.servlet.Filter;
  8. import javax.servlet.FilterChain;
  9. import javax.servlet.FilterConfig;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletRequest;
  12. import javax.servlet.ServletResponse;
  13. import javax.servlet.annotation.WebFilter;
  14. import javax.servlet.annotation.WebInitParam;
  15. import javax.servlet.http.HttpServletRequest;
  16. /**
  17. * 日志监听器,记录每天的访问情况
  18. * @author littlemotor
  19. * @since 18.8.22
  20. */
  21. @WebFilter(filterName = "LoggingFilter",
  22. urlPatterns = {"/*"},
  23. initParams = {
  24. @WebInitParam(name = "logFileName", value = "log.txt")
  25. })
  26. public class LoggingFilter implements Filter{
  27. private PrintWriter viewLogger;
  28. private PrintWriter counterLogger;
  29. @Override
  30. public void init(FilterConfig filterConfig) throws ServletException {
  31. //String logFileName = filterConfig.getInitParameter("logFileName");
  32. //String appPath = filterConfig.getServletContext().getRealPath("/");
  33. //System.out.println(appPath);
  34. try {
  35. viewLogger = new PrintWriter(new File("/Users/littlemotor/webLog/","log.txt"));
  36. } catch (FileNotFoundException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. /**
  41. * Filter链,注意在最后加doFilter
  42. */
  43. @Override
  44. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  45. throws IOException, ServletException {
  46. HttpServletRequest httpRequest = (HttpServletRequest)request;
  47. viewLogger.println(new Date() + " " + "URI: " + httpRequest.getRequestURI() );
  48. viewLogger.flush();
  49. chain.doFilter(request, response);
  50. }
  51. @Override
  52. public void destroy() {
  53. System.out.println("destroying filter");
  54. if(viewLogger != null) {
  55. viewLogger.close();
  56. }
  57. }
  58. }

发表评论

表情:
评论列表 (有 0 条评论,412人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Filter 过滤器

    Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1.什么是Filter及其作用介绍      Filter是sun公司中servlet2.3后增加的一

    相关 Filter过滤器

    Filter的基本功能是对servlet容器调用servlet的过程进行拦截,从而在servlet进行响应处理的前后实现一些特殊的功能。 在servletAPI中定义了三个接

    相关 Filter过滤器

    过滤器: 过滤   过滤请求 可以写多个 从用户访问  ->第一个过滤器  -> 第二个过滤 -> servlet   生命周期:随着项目的启动而创建 当访问了地址后而

    相关 Filter过滤器

    一、Filter过滤器 1、介绍       Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态资源文件等进行

    相关 Filter 过滤器

    > 过滤器,其实就是对客户端发出来的请求进行过滤。浏览器发出,然后服务器派Servlet处理。在中间就可以过滤,其实过滤器起到的是拦截的作用,也就是拦截器。 作用