zoukankan      html  css  js  c++  java
  • Spring 管理Filter和Servlet

        本文转载自:http://www.open-open.com/lib/view/open1417248512252.html

        在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象的创建。如果要在filter或者servlet中使用spring容器管理业务对象,通常需要使用WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext())来获得WebApplicationContext,然后调用WebApplicationContext.getBean("beanName")来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在filter或者servlet代码中硬编码了应用对象的bean名字。为了能在filter或者servlet中感知spring中bean,可采用如下步骤来实现:

    1-  将filter或者servlet作为bean定义在context.xml文件中,和要应用的bean定义放在一起;

    2-  实现一个filter代理或者servlet代理,该代理用WebApplicationContext来获得在context.xml中定义的filter或者servlet的对象,并将任务委托给context.xml中定义的filter或者servlet

    3-  在web.xml中用ContextLoaderListener来初始化spring  的context,同时在filter代理或者servlet代理的定义中用初始化参数来定义context.xml中filter或者servlet的bean名字(或者直接受用代理的名称获得相应的filter或者servlet的名称)。

    4-  在web.xml中定义filter代理或者servlet代理的mapping.

    利用这种方式就将filter或者servlet和业务对象的依赖关系用spring来进行管理,并且不用在servlet中硬编码要引用的对象名字。

    具体实例如下:

    Filter

    1.       在applicationContext.xml中定义filter:

    1 <bean id="springFilter" class="com.netqin.filter.SpringFilter">
    3               <property name="name">
    5                   <value>SpringFilter</value>
    7               </property>
    9 </bean>

    说明:com.netqin.filter.SpringFilter为实现了javax.servlet.Filter接口的filter

    2.       实现filter代理

    实际上,filter代理不需要我们自己来实现,Spring提供了两种现成的filter代理

    org.springframework.security.util.FilterToBeanProxy,

    org.springframework.web.filter.DelegatingFilterProxy,两者只是在web.xml中的配置上略有不同,下面就让我们一起看看如何在web.xml中进行配置。

    3.       配置web.xml

    Ø         初始化spring的context

    因为是使用spring来管理,所以在使用filter前先要初始化spring的context,一般来说配置如下:

     1 <context-param>
     2 
     3         <param-name>contextConfigLocation</param-name>
     4 
     5         <param-value>
     6 
     7             /WEB-INF/applicationContext.xml
     8 
     9         </param-value>
    10 
    11     </context-param>
    12 
    13     <listener>
    14 
    15         <listener-class>
    16 
    17             org.springframework.web.context.ContextLoaderListener
    18 
    19         </listener-class>
    20 
    21     </listener>

    Ø         Filter配置:

    1.       FilterToBeanProxy

     1 <filter>
     2 
     3         <filter-name> springFilter </filter-name>
     4 
     5         <filter-class>
     6 
     7             org.springframework.security.util.FilterToBeanProxy
     8 
     9         </filter-class>
    10 
    11         <init-param>
    12 
    13             <param-name>targetBean</param-name>
    14 
    15             <param-value>springFilter</param-value>
    16 
    17         </init-param>
    18 
    19     </filter>

    说明:需要为FilterToBeanProxy提供上下文参数,这里我们配置的是targetBean属性,它告诉spring在context中查找的bean名称,所以当请求被过滤器拦截后FilterToBeanProxy会在applicationContext.xml中会查找id为springFilter的bean.

    我们也可以配置targetClass属性,意思就是查找该类型的bean.

    2.      DelegatingFilterProxy

     1 <filter>
     2 
     3         <filter-name>springFilter</filter-name>
     4 
     5         <filter-class>
     6 
     7             org.springframework.web.filter.DelegatingFilterProxy
     8 
     9         </filter-class>
    10 
    11     </filter>

    说明:使用DelegatingFilterProxy时不需要配置任何参数,spring会根据filter-name的名字来查找bean,所以这里spring会查找id为springFilter的bean.

    4.       配置filter的mapping

    1 <filter-mapping>
    2 
    3         <filter-name>springFilter</filter-name>
    4 
    5         <url-pattern>/*</url-pattern>
    6 
    7     </filter-mapping>

    OK!filter配置完成。推荐使用DelegatingFilterProxy,应为配置上更简单。

    Servlet

    Servlet的配置与Filter的配置十分相似

    1.       在applicationContext.xml中定义servlet

    1 <bean id="springServlet" class="com.netqin.servlet.SpringServlet">
    2 
    3               <property name="name">
    4 
    5                   <value>SpringServlet</value>
    6 
    7               </property>
    8 
    9        </bean>

    说明:com.netqin.servlet.SpringServlet继承自

    javax.servlet.http.HttpServlet

    2.       实现servlet代理

    与filter不同,spring没有为servlet提供代理实现,需要我们自己来创建,不过放心,创建一个servlet代理十分简单,一个具体的实现如下:

     1 import java.io.IOException;
     2 
     3 import javax.servlet.GenericServlet;
     4 
     5 import javax.servlet.Servlet;
     6 
     7 import javax.servlet.ServletException;
     8 
     9 import javax.servlet.ServletRequest;
    10 
    11 import javax.servlet.ServletResponse;
    12 
    13 import org.springframework.web.context.WebApplicationContext;
    14 
    15 import org.springframework.web.context.support.WebApplicationContextUtils;
    16 
    17  
    18 
    19 public class ServletToBeanProxy extends GenericServlet {
    20 
    21     private String targetBean;
    22 
    23     private Servlet proxy;
    24 
    25     public void init() throws ServletException {
    26 
    27         this.targetBean = getInitParameter("targetBean");
    28 
    29         getServletBean();
    30 
    31         proxy.init(getServletConfig());
    32 
    33     }
    34 
    35     public void service(ServletRequest req, ServletResponse res)
    36 
    37             throws ServletException, IOException {
    38 
    39         proxy.service(req, res);
    40 
    41     }
    42 
    43     private void getServletBean() {
    44 
    45         WebApplicationContext wac = WebApplicationContextUtils
    46 
    47                 .getRequiredWebApplicationContext(getServletContext());
    48 
    49         this.proxy = (Servlet) wac.getBean(targetBean);
    50 
    51     }
    52 
    53 }

    说明:相信看了代码就明白了,它利用targetBean属性在spring中查找相应的servlet,

    这很像FilterToBeanProxy的方式,所以我为其取名为ServletToBeanProxy。当然,我们也可以使用类似于DelegatingFilterProxy的方式,只需要将上述代码中标记为黄色的部分修改为this.targetBean=this.getServletName();即可,我们相应的命名为DelegatingServletProxy。

    3.       配置web.xml

    Ø         初始化spring的context

    与filter中的说明一致,不再赘述。

    Ø         Servlet配置:

    1.       ServletToBeanProxy

     1 <servlet>
     2 
     3         <servlet-name>springServlet</servlet-name>
     4 
     5         <servlet-class>
     6 
     7             com.netqin.servlet.proxy.ServletToBeanProxy
     8 
     9         </servlet-class>
    10 
    11         <init-param>
    12 
    13             <param-name>targetBean</param-name>
    14 
    15             <param-value>springServlet</param-value>
    16 
    17         </init-param>
    18 
    19         <load-on-startup>1</load-on-startup>
    20 
    21     </servlet>

    2.       DelegatingServletProxy

     1 <servlet>
     2 
     3         <servlet-name>springServlet</servlet-name>
     4 
     5         <servlet-class>
     6 
     7             com.netqin.servlet.proxy.DelegatingServletProxy
     8 
     9         </servlet-class>
    10 
    11         <load-on-startup>1</load-on-startup>
    12 
    13     </servlet>

    4.       配置servlet的mapping

    1 <filter-mapping>
    2 
    3         <filter-name>springServlet</filter-name>
    4 
    5         <url-pattern>/servlet/*</url-pattern>
    6 
    7     </filter-mapping>

    OK!servlet的配置完成。推荐使用DelegatingServletProxy,应为配置上更简单。

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/jsStudyjj/p/4876724.html
Copyright © 2011-2022 走看看