• 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>
  • 相关阅读:
    深度拾遗(06)
    非平衡数据处理
    深度拾遗(05)
    深度拾遗(00)
    深度拾遗(04)
    深度拾遗(03)
    深度拾遗(02)
    js继承方式
    js带缩略图的图片切换效果
    获取SQL Server数据库中的表和字段描述
  • 原文地址:https://www.cnblogs.com/Shunia123/p/10668496.html
Copyright © 2020-2023  润新知