浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

 更新时间:2020年07月23日 10:33:08   作者:浅笑安然Shunia  
这篇文章主要介绍了浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.过滤器:

  依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据.

  比如:在过滤器中修改字符编码;在过滤器中修改 HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

  关于过滤器的一些用法可以参考我写过的这些文章:

    继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数:https://www.zifangsky.cn/677.html

    在SpringMVC中使用过滤器(Filter)过滤容易引发XSS的危险字符:https://www.zifangsky.cn/683.html

2.拦截器:

  依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用.

  因此可以使用spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

  关于拦截器的一些用法可以参考我写过的这些文章:

    SpringMVC中使用拦截器(interceptor)拦截CSRF攻击(修):https://www.zifangsky.cn/671.html

    SpringMVC中使用Interceptor+cookie实现在一定天数之内自动登录:https://www.zifangsky.cn/700.html

3.执行顺序

  过滤器的运行是依赖于servlet容器的,跟springmvc等框架并没有关系。并且多个过滤器的执行顺序跟web.xml文件中定义的先后关系有关。

  拦截器的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。

SpringMVC的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans .......>
 <mvc:default-servlet-handler />

 <context:component-scan base-package="com.netease.mmc.demo.web">
  <!-- enable controller advice -->
  <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
 </context:component-scan>
 <context:component-scan base-package="com.netease.mmc.demo.imdemo.web"/>

 <context:annotation-config />

 <mvc:interceptors>
  <mvc:interceptor>
   <mvc:mapping path="/**"/>
   <bean class="com.netease.mmc.demo.common.spring.interceptor.DDOSInterceptor">
    <property name="close" value="false"/>
    <property name="maxRequest" value="2000"/>
    <property name="ttlSeconds" value="10"/>
   </bean>
  </mvc:interceptor>
  <mvc:interceptor>
   <mvc:mapping path="/**"/>
   <bean class="com.netease.mmc.demo.common.spring.interceptor.WebContextHolderInterceptor"/>
  </mvc:interceptor>
  <mvc:interceptor>
   <mvc:mapping path="/api/**"/>
   <bean class="com.netease.mmc.demo.web.interceptor.ValidateAppKeyInterceptor" />
  </mvc:interceptor>
 </mvc:interceptors>

 <mvc:annotation-driven ignore-default-model-on-redirect="true">
  <!-- message converters -->
  <mvc:message-converters>
   <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
   <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    <constructor-arg value="UTF-8"/>
   </bean>
   <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
   <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
   <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="objectMapper" ref="objectMapper"/>
   </bean>
  </mvc:message-converters>
 </mvc:annotation-driven>

 <!-- view resolver -->
 <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
  <!-- api server has no page view resolvers, add viewResolvers config here if required -->
  <property name="defaultViews">
   <list>
    <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
     <property name="objectMapper" ref="objectMapper"/>
     <property name="contentType" value="application/json;charset=UTF-8"/>
     <property name="modelKeys">
      <set>
       <value>res</value>
       <value>msg</value>
       <value>errmsg</value>
      </set>
     </property>
    </bean>
    <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
     <property name="marshaller" ref="xstreamMarshaller"/>
     <property name="modelKey" value="data"/>
     <property name="contentType" value="application/xml"/>
    </bean>
   </list>
  </property>
 </bean>

 <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
  <property name="mediaTypes">
   <map>
    <entry key="json" value="application/json;charset=UTF-8"/>
    <entry key="xml" value="application/xml;charset=UTF-8"/>
    <entry key="html" value="text/html;charset=UTF-8"/>
   </map>
  </property>
  <property name="defaultContentType" value="application/json;charset=UTF-8"/>
 </bean>

 <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
  <property name="serializationInclusion" value="NON_NULL" />
 </bean>

 <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
  <property name="autodetectAnnotations" value="true" />
  <property name="streamDriver">
   <bean class="com.thoughtworks.xstream.io.xml.DomDriver" />
  </property>
 </bean>

 <aop:aspectj-autoproxy/>
</beans>

到此这篇关于浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件的文章就介绍到这了,更多相关SpringMVC拦截器 Servlet过滤器 SpringMVC配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决SpringBoot内嵌Tomcat并发容量的问题

    解决SpringBoot内嵌Tomcat并发容量的问题

    这篇文章主要介绍了解决SpringBoot内嵌Tomcat并发容量的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 当mybatis返回值遇见内部类的问题

    当mybatis返回值遇见内部类的问题

    这篇文章主要介绍了当mybatis返回值遇见内部类的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 在Elasticsearch中添加字段的详细步骤

    在Elasticsearch中添加字段的详细步骤

    在ES中,增加字段相对比较容易,因为ES支持动态映射(Dynamic Mapping),这篇文章主要给大家介绍了关于在Elasticsearch中添加字段的详细步骤,文中给出了详细的代码实例,需要的朋友可以参考下
    2024-07-07
  • java中Scanner类的简单用法分享

    java中Scanner类的简单用法分享

    这篇文章主要介绍了java中Scanner类的简单用法,有需要的朋友可以参考一下
    2014-01-01
  • Swagger异常定位纪实Swagger设计问题分析

    Swagger异常定位纪实Swagger设计问题分析

    这篇文章主要为大家介绍了Swagger异常定位纪实Swagger设计的问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • jmeter基本使用小结

    jmeter基本使用小结

    jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。本文就简单的介绍一下如何使用,感兴趣的
    2021-11-11
  • 详解SpringCloud-OpenFeign组件的使用

    详解SpringCloud-OpenFeign组件的使用

    这篇文章主要介绍了SpringCloud-OpenFeign组件的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java调用ffmpeg实现转换视频

    java调用ffmpeg实现转换视频

    这篇文章主要为大家详细介绍了java调用ffmpeg实现转换视频功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Spring集成Druid连接池及监控配置的全过程

    Spring集成Druid连接池及监控配置的全过程

    java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池,下面这篇文章主要给大家介绍了关于Spring集成Druid连接池及监控配置的相关资料,需要的朋友可以参考下
    2021-09-09
  • Java解析变量公式的简单示例

    Java解析变量公式的简单示例

    在Java编程中,经常会遇到需要解析表达式或公式的情况,特别是涉及到动态计算或配置项的场景,在本篇文章中,我将介绍如何在Java中解析变量公式,并给出一个简单的实现示例,需要的朋友可以参考下
    2024-10-10

最新评论