• Servlet基础知识(四)——Servlet过滤器Filter


    一、什么是过滤器:

      政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入;同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求。

      同样的,Servlet中的过滤器既可以对客户端发来的请求,在Servlet接收之前进行过滤;也可以对Servlet发出的响应,在客户端接收之前进行过滤。

    二、过滤器的实现:

      Servlet的过滤器是通过实现javax.servlet.Filter接口实现的。(也就是说Servlet过滤器其实就是一个实现了Filter的Serlvet类)。该接口有三个方法:  

    init(FilterConfig filterConfig)

        Servlet的初始化方法:读取web.xml中配置的Filter的初始化参数(它的参数提供了filterConfig对象,该对象可以读取web.xml里的配置)。init()只会被调用一次。

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取Filter初始化参数
        String username = filterConfig.getInitParameter("username");
    }
    doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        Servlet的过滤方法:当客户端的请求的符合被过滤的范围时,该方法进行过滤处理。处理完后chain再调用doFilter(request,response),表示继续执行下一个过滤器。

        (这里的ServletRequest和ServletResponse都要强制转换成HttpSevletRequest和HttpServletResponse,因为Servlet实现的请求和响应式Http类型的。

    destroy()

        Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

    三、在web.xml中配置Filter:

      注意:一般Filter都是配置在Servlet之前的。

      过滤器中init(FilterConfig filterConfig)就是用来获取配置的这些信息,初始化过滤器的。

      <filter>
          <filter-name>LoginFilter</filter-name>     //过滤器的名字
          <filter-class>com.itzhai.login.LoginFilter</filter-class>      //过滤器类名
      </filter>
    
      <filter-mapping>
          <filter-name>LoginFilter</filter-name>
          <url-pattern>/*</url-pattern>        //要过滤的url
      </filter-mapping>

    四、过滤敏感词的过滤器例子:

    @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            //转换成实例的请求和响应对象
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse resp = (HttpServletResponse)response;
            //获取评论并屏蔽关键字
            String comment = req.getParameter("comment");
            comment = comment.replace("A", "***");
            //重新设置参数
            req.setAttribute("comment", comment);
            //继续执行
            chain.doFilter(request, response);
        }
  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/4122934.html
Copyright © 2020-2023  润新知