过滤器

㈠ 什么是过滤器?

    servlet规范当中定义的一种特殊的组件,可以拦截servlet容器调用的过程并进行相应的处理。

 

㈡ 如何写一个过滤器?

    step1,写一个java类,实现Filter接口。

    step2, 在doFilter方法里面,编写拦截处理逻辑。

    step3, 配置过滤器(web.xml,告诉容器哪一些请求需要拦截<url-pattern>必须相同才能拦截)。

 

㈢ 过滤器的优先级

    如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用过滤器。

 

㈣ 初始化参数

    step1,使用<init-param>为过滤器添加初始化参数。

        <filter>

            <filter-name>......</filter-name>

            <filter-class>......</filter-class>

            <init-param>

                 <param-name>illegalStr</param-name>

                 <param-value>cat</param-value>

            </init-param>        

        <filter>

 

    step2,使用FilterConfig对象的getInitParameter方法来读取

    比如:config.getInitParameter("illegalStr");

 

代码示例:

public class CommentFilter1 implements Filter{

        private FilterConfig config;

        public CommentFilter1(){

                System.out.println("Filter1's constructor...");

        }

        /**

         * 容器在删除过滤器之前,会调用

         * destroy方法。

         */

        public void destroy() {

                System.out.println("Filter1's destroy...");

        }

        

        /**

         * 容器会调用doFilter方法来处理请求。

         * 容器会将request对象和response对象作为

         * 参数传给doFilter方法。

         * FilterChain对象有一个doFilter方法,如果该

         * 方法调用了,表示让容器继续向后调用后续的

         * 过滤器或者servlet。

         */

        public void doFilter(ServletRequest arg0, 

                        ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {

                System.out.println("Filter1's doFilter begin...");

                HttpServletRequest request = (HttpServletRequest)arg0;

                HttpServletResponse response = (HttpServletResponse)arg1;

                request.setCharacterEncoding("utf-8");

                String content = request.getParameter("content");

                response.setContentType("text/html;charset=utf-8");

                PrintWriter out = response.getWriter();

                //读过滤器的初始化参数

                String illegalStr = config.getInitParameter("illegalStr");

                if(content.indexOf(illegalStr) != -1){

                        out.println("评论当中包含了敏感字");

                }else{

                        //调用后续的过滤器或者servlet

                        arg2.doFilter(arg0, arg1);

                }

                System.out.println("Filter1's doFilter end.");

        }

        

        /**

         * 容器启动之后,会立即创建过滤器对象,

         * 接下来,会调用init方法。在调用init方法之前,

         * 容器会先创建好一个符合FilterConfig接口要求

         * 的对象,该对象可以用来访问过滤器的初始

         * 化参数(getInitParameter(String paraname))。

         */

        public void init(FilterConfig arg0) throws ServletException {

                System.out.println("Filter1's init...");

                config = arg0;

        }

}

 

web.xml配置

        <filter>

                  <filter-name>filter1</filter-name>

                  <filter-class>web.CommentFilter1</filter-class>

                  <!-- 初始化参数 -->

                  <init-param>

                          <param-name>illegalStr</param-name>

                          <param-value>cat</param-value>

                  </init-param>

          </filter>

          <filter>

                  <filter-name>filter2</filter-name>

                  <filter-class>web.CommentFilter2</filter-class>

          </filter>

          <filter-mapping>

                  <filter-name>filter2</filter-name>

                  <url-pattern>/comment</url-pattern>

          </filter-mapping>

          <filter-mapping>

                  <filter-name>filter1</filter-name>

                  <url-pattern>/comment</url-pattern>

          </filter-mapping>

          <servlet>

                  <servlet-name>CommentServlet</servlet-name>

                  <servlet-class>web.CommentServlet</servlet-class>

          </servlet>

          <servlet-mapping>

                  <servlet-name>CommentServlet</servlet-name>

                  <url-pattern>/comment</url-pattern>

          </servlet-mapping>

你可能感兴趣的:(过滤器)