Servlet-过滤器Filter

来源:互联网 发布:国内最好数据恢复公司 编辑:程序博客网 时间:2024/05/18 03:57

Servlet-过滤器Filter

sf2gis@163.com

2015年9月17日

 

1 目标:在Servlet的处理前后进行过滤。

2 原理:一种特殊的Servlet,只进行过滤操作。将过滤-处理-过滤形成一种处理链。

3 处理前过滤请求,将请求转发到指定Servlet,接收处理结果,并在处理后过滤结果。

4 流程:配置过滤器,过滤请求,转发请求,接收响应,过滤结果。

5 方法:xml配置过滤器

5.1 配置过滤器:与Servlet相似。将请求交由过滤器servlet处理。

  <filter>

      <filter-name>log</filter-name>

      <filter-class>lee.LogFilter</filter-class>

  </filter>

  <filter-mapping>

      <filter-name>log</filter-name>

      <url-pattern>/*</url-pattern>

  </filter-mapping>

5.1.1请求与过滤映射:<filter-mapping>

名称:filter-name,url模式:url-pattern

5.1.2过滤器与实现类映射:<filter>

名称:filter-name,实现类:filter-class

5.2 过滤请求:所有指定的url都将过滤。request代表请求。

5.3 转发请求:chain.doFilter()

5.4 过滤结果:处理response。

5.5 示例:xml配置文件配置过滤器

//web.xml

<?xmlversion="1.0" encoding="ISO-8859-1"?>

<!--

  Licensed to the Apache Software Foundation(ASF) under one or more

  contributor license agreements.  See the NOTICE file distributed with

  this work for additional informationregarding copyright ownership.

  The ASF licenses this file to You under the ApacheLicense, Version 2.0

  (the "License"); you may not usethis file except in compliance with

  the License. You may obtain a copy of the License at

 

     http://www.apache.org/licenses/LICENSE-2.0

 

  Unless required by applicable law or agreedto in writing, software

  distributed under the License is distributedon an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.

  See the License for the specific languagegoverning permissions and

  limitations under the License.

-->

<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

                     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

  version="3.1"

  metadata-complete="true">

  <filter>

      <filter-name>log</filter-name>

      <filter-class>lee.LogFilter</filter-class>

  </filter>

  <filter-mapping>

      <filter-name>log</filter-name>

      <url-pattern>/*</url-pattern>

  </filter-mapping>

</web-app>

//LogFilter.java

package lee;

 

import java.io.IOException;

import java.util.Date;

 

import javax.servlet.Filter;

importjavax.servlet.FilterChain;

importjavax.servlet.FilterConfig;

importjavax.servlet.ServletException;

import javax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.annotation.WebFilter;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

/**

 * Servlet Filter implementation classLogFilter

 */

@WebFilter("/LogFilter")

public class LogFilterimplements Filter {

 

    /**

     * Default constructor.

     */

    public LogFilter() {

        // TODO Auto-generated constructor stub

    }

 

      /**

       * @see Filter#destroy()

       */

      public void destroy() {

            // TODOAuto-generated method stub

      }

 

      /**

       * @seeFilter#doFilter(ServletRequest, ServletResponse, FilterChain)

       */

      public void doFilter(ServletRequest request, ServletResponseresponse, FilterChain chain) throws IOException, ServletException {

           // TODO Auto-generated method stub

           // place your code here

           System.out.println("startfilter..."+new Date().toString());

           HttpServletRequesthreq=(HttpServletRequest)request;

           System.out.println("request="+hreq.getServletPath());

           // pass the request alongthe filter chain

           chain.doFilter(request,response);

           HttpServletResponsehresp=(HttpServletResponse)response;

           System.out.println("finishedfilter..."+new Date().toString());

           System.out.println("URI="+hreq.getRequestURI()); 

           System.out.println("response="+hresp.getStatus());

      }

 

      /**

       * @seeFilter#init(FilterConfig)

       */

      public void init(FilterConfig fConfig) throws ServletException{

           // TODO Auto-generated method stub

      }

 

}

//catalina.out

start filter...Mon Sep 1416:43:16 CST 2015

request=/a.jsp

finished filter...Mon Sep 1416:43:16 CST 2015

URI=/webDemo/a.jsp

response=200

start filter...Mon Sep 1416:43:43 CST 2015

request=/c.jsp

finished filter...Mon Sep 1416:43:43 CST 2015

URI=/webDemo/c.jsp

response=404

 

6 方法:annotation配置过滤器:@WebFilter

6.1 目标:直接在类中设置过滤器属性,减少web.xml的配置,方便配置。

6.2 原理:容器识别注记。

6.3 流程:在web.xml中启用注记。生成处理类。在处理类中设置注记@WebFilter。

6.4 方法:

设置过滤器的URL模式:urlPatterns。

设置过滤器的初始化参数:initParam=(@WebInitParam(name=xx,value=xx)…)

参考:http://www.2cto.com/kf/201210/162383.html

6.5 示例:过滤所有请求,并获取初始化参数

//处理类:LogFilter.java

package lee;

 

import java.io.IOException;

import java.util.Date;

 

import javax.servlet.Filter;

importjavax.servlet.FilterChain;

importjavax.servlet.FilterConfig;

import javax.servlet.ServletException;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.annotation.WebFilter;

importjavax.servlet.annotation.WebInitParam;

importjavax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

/**

 * Servlet Filter implementation classLogFilter

 */

 

@WebFilter(urlPatterns="/*",

initParams={@WebInitParam(name="init1",value="i111"),

           @WebInitParam(name="init2",value="i222")})

public class LogFilter implementsFilter {

 

    /**

     * Default constructor.

     */

    public LogFilter() {

        // TODO Auto-generated constructor stub

    }

 

      /**

       * @see Filter#destroy()

       */

      public void destroy() {

           // TODO Auto-generated method stub

      }

 

      /**

       * @seeFilter#doFilter(ServletRequest, ServletResponse, FilterChain)

       */

      public void doFilter(ServletRequest request, ServletResponseresponse, FilterChain chain) throws IOException, ServletException {

           // TODO Auto-generated method stub

           // place your code here

           System.out.println("start filter..."+newDate().toString());

           HttpServletRequest hreq=(HttpServletRequest)request;

           System.out.println("request="+hreq.getServletPath());

           // pass the request along the filter chain

           chain.doFilter(request, response);

           HttpServletResponse hresp=(HttpServletResponse)response;

           System.out.println("finished filter..."+newDate().toString());

           System.out.println("URI="+hreq.getRequestURI()); 

           System.out.println("response="+hresp.getStatus());

      }

 

      /**

       * @seeFilter#init(FilterConfig)

       */

      public void init(FilterConfig fConfig) throws ServletException{

           // TODO Auto-generated method stub

           System.out.println("init="+fConfig.getInitParameter("init1"));

      }

 

}

//结果

//a.jsp请求

 

0 0