Spring MVC内置过滤器功能示例详解

 更新时间:2023年09月15日 09:17:33   作者:福  
这篇文章主要为大家介绍了Spring MVC内置过滤器使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

SpringMVC内置如下过滤器

  • Form Data
  • Forwarded Headers
  • Shallow ETag
  • CORS

Form Data

浏览器可以通过HTTP GET或HTTP POST提交form data(表单数据),但是非浏览器客户端可以通过HTTP PUT、HTTP DELETE、HTTP PATCH提交表单数据。但是Servlet规范约定,通过Servlet API的ServletRequest.getParameter*()系列接口只能获取到HTTP POST提交的表单数据。

所以,通过其他方式提交的表单数据就获取不到。

SpringMVC提供了一个解决该上述问题的方案,就是FormContentFilter过滤器,FormContentFilter 是SpringMVC的内置过滤器,配置后立即生效,可以把除POST的其他方法提交上来的表单数据(content type为application/x-www-form-urlencoded)包装成servletRequest的参数、从而通过Servlet API的ServletRequest.getParameter*()方法获取到。

源码:

@Override
    protected void doFilterInternal(
            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        MultiValueMap<String, String> params = parseIfNecessary(request);
        if (!CollectionUtils.isEmpty(params)) {
            filterChain.doFilter(new FormContentRequestWrapper(request, params), response);
        }
        else {
            filterChain.doFilter(request, response);
        }
    }

解析context type为"application/x-www-form-urlencoded"的body信息获取到表单数据组成params Map,之后将params包装到FormContentRequestWrapper中的formParams属性中:

public FormContentRequestWrapper(HttpServletRequest request, MultiValueMap<String, String> params) {
            super(request);
            this.formParams = params;
        }

        @Override
        @Nullable
        public String getParameter(String name) {
            String queryStringValue = super.getParameter(name);
            String formValue = this.formParams.getFirst(name);
            return (queryStringValue != null ? queryStringValue : formValue);
        }

之后调用HttpServletRequest的getParameter方法会从formParams中获取数据。

Forwarded Headers

RFC 7239 定义了HTTP Forwarded请求头来反应经过代理之后的原始请求头信息,比如原始请求主机、端口号等信息。此外,还会有其他的非标准的转发头信息比如:X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto, X-Forwarded-Ssl, X-Forwarded-Prefix等等。

SpringMVC提供了一个内置过滤器ForwardedHeaderFilter,目的是:

  • 改变Forwarded请求头的host、port等相关信息
  • 移除这些头信息,以便消除后续影响(比如处于安全考虑)

如果配置ForwardedHeaderFilter的参数removeOnly=true的话,所有forwarded相关的参数都会被移除:

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {

        if (this.removeOnly) {
            ForwardedHeaderRemovingRequest wrappedRequest = new ForwardedHeaderRemovingRequest(request);
            filterChain.doFilter(wrappedRequest, response);
        }

否则,ForwardedHeaderFilter将会从HTTP Forwarded请求头中重新构建request及response的包装类,使得包装类中的请求反应HTTP Forwarded中的原始请求信息。因此,后续的处理从request中拿到的就会是原始请求的相关信息。

Shallow ETag

ShallowEtagHeaderFilter是SpringMVC用来处理“弱”ETag的过滤器,配置打开该过滤器后,会计算请求内容的MD5到response中,下次浏览器再次发送请求的时候会通过request的头信息If-None-Match发送该MD5数据,ShallowEtagHeaderFilter会再次计算请求内容的MD5值并与request头信息的If-None-Match比较,如果相等的话,则返回前台304状态码。

这个策略会节约网络带宽但是不会节省CPU计算,因为每次请求上来之后请求内容都需要被计算一次MD5,如果通过MD5判断后请求内容和上次请求相同的话,只返回304状态码而无需再次返回内容。

测试发现chrome浏览器在后台发送Etag回来之后也并不会发送If-None-Match,会导致该过滤器无效,应该是需要chrome端做一个什么设置,尚未搞定,各位如果需要使用本过滤器的话需要注意。但是换成Edge浏览器之后是正常的、可以收到304的。

COR

跨域过滤器CorsFilter,如果不使用Spring Security的话,可以通过CorsFilter进行跨域处理。

以上就是Spring MVC 八 - 内置过滤器的详细内容,更多关于Spring MVC内置过滤器的资料请关注脚本之家其它相关文章!

相关文章

  • Java中scheduleAtFixedRate的用法

    Java中scheduleAtFixedRate的用法

    如何正确使用Java中的scheduleAtFixedRate是一篇介绍Java中定时任务调度器的文章。它详细介绍了scheduleAtFixedRate方法的用法、参数及作用,并给出了一些实例以帮助读者更好地理解其使用。本文为Java开发人员提供了一些实用的技巧,帮助他们更好地管理和控制定时任务
    2023-04-04
  • Spring实战之Bean定义中的SpEL表达式语言支持操作示例

    Spring实战之Bean定义中的SpEL表达式语言支持操作示例

    这篇文章主要介绍了Spring实战之Bean定义中的SpEL表达式语言支持操作,结合实例形式分析了Bean定义中的SpEL表达式语言操作步骤与实现技巧,需要的朋友可以参考下
    2019-12-12
  • spring如何通过FactoryBean配置Bean

    spring如何通过FactoryBean配置Bean

    这篇文章主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java 关系运算符详情及案例(下)

    Java 关系运算符详情及案例(下)

    这篇文章主要介绍了Java 关系运算符详情及案例的实现,主要续上篇文章,上一篇文章我们讲到“等于”运算符 (==)、“不等于”运算符(!=)、“大于”运算符(>) ,这篇文章继续给大家讲解相关知识,需要的朋友可以参考一下
    2021-12-12
  • 详解spring整合hibernate的方法

    详解spring整合hibernate的方法

    这篇文章主要介绍了spring整合hibernate的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Spring Boot使用Druid连接池的示例代码

    Spring Boot使用Druid连接池的示例代码

    Druid是Java语言中最好的数据库连接池。这篇文章主要介绍了Spring Boot使用Druid连接池的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 完美解决Eclipse导入的项目上有个红叉,但不影响项目运行的问题

    完美解决Eclipse导入的项目上有个红叉,但不影响项目运行的问题

    这篇文章主要介绍了完美解决Eclipse导入的项目上有个红叉,但不影响项目运行的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java操作透明图片并保持背景透明的实现

    Java操作透明图片并保持背景透明的实现

    这篇文章主要介绍了Java操作透明图片并保持背景透明的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 关于Spring框架中异常处理情况浅析

    关于Spring框架中异常处理情况浅析

    最近学习Spring时,认识到Spring异常处理的强大,这篇文章主要给大家介绍了关于Spring框架中异常处理情况的相关资料,通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • java解析dbf之通过javadbf包生成和读取dbf文件

    java解析dbf之通过javadbf包生成和读取dbf文件

    这篇文章主要介绍了java通过javadbf读取和生成DBF文件的方法,大家参考使用吧
    2014-01-01

最新评论