动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Spring MVC过滤器作用

08-25 17:38 68浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Spring MVC框架中的Spring-web模块提供了许多非常实用的Filter(过滤器),这些过滤器在Spring MVC框架中扮演着各种各样的角色,本文我们就来揭示这些Spring MVC过滤器作用

Spring MVC过滤器作用Filter个重要的角下面为大家一一讲解这些Filter扮演的角色:

1.HttpPutFormContentFilter

浏览器只能通过GET或者POST提交FORM数据,但是非浏览器的客户端可以使用PUT或者PATCH。Servlet API仅为POST方法提供了ServletRequest.getParameter*()方法获取FORM信息。spring-web模块提供了HttpPutFormContentFilter检查PUT或者PATCH方法的content-type是否是application/x-www-form-urlencoded,如果是,则从请求体重读取属性并封装到ServletRequest中,以便日后通过ServletRequest.getParameter*()获取FORM数据。

2.ShallowETagFilter

ShallowEtagHeaderFilter为ETG提供了过滤器,我们对于视图技术中的ETAG不进行过多的解释,感兴趣的同学可以自行查阅资料。

3.ForwardedHeaderFilter

由于请求会经过像负载均衡器这样的代理,那么host,port,scheme在创建一些资源文件的链接的时候返回给客户端可能是有所不同的。 RFC 7239 为代理定义了Forwarded 的HTTP头来提供原始请求的信息。同样也有一些其他非标准的HTTP头,例如:X-Forwarded-Host,X-Forwarded-Port,X-Forwarded-Proto。ForwardedHeaderFilter会从Forwarded,X-Forwarded-Host,X-Forwarded-Port或者X-Forwarded-Proto中获取跳转信息。他分装了请求以覆盖host,port,scheme,同样为日后的处理隐藏跳转信息。在应用层是无法判断一个挑战是否是可信的。所以要正确配置网络上游代理,以便过滤掉不合法的跳转。如果应用没有使用代理,那么就无需使用ForwardedHeaderFilter过滤器。

4.CORSFilter

通过controller的注解Spring MVC对CORS提供了详细的支持。在和Spring Sercurity一同使用的时候CorsFilter必须排在Spring Sercurity的过滤器之前。这也是Spring MVC中最重要的一类Filter。

由于安全原因,浏览器禁止AJAX跳出当前域去访问资源。例如你的银行帐号在一个tab页打卡了,另一个evil.com在其他tab打开。evil.com的脚本不能使用你的银行账号信息去访问银行的API。 Cross-Origin Resource Sharing (CORS) 是由众多浏览器实现的W3C的规范。他规定了允许哪些请求可以跨域,而不是通过弱安全的和功能受限的IFRAME和JSONP。 HandlerMapping对CORS提供了内置支持。成功将请求映射到处理器后,HandlerMapping对当前请求检查CORS配置,预检请求直接处理,简单和实际请求则检查CORS请求,验证,设置返回header。 为了开启跨域请求(例如Origin头和请求的host不一致),需要对CORS进行明确的配置。如果没有找到CORS的配置,那么直接拒绝预检请求,简单请求和实际请求不会添加响应头,因此浏览器不会获取到信息。 每一个HandlerMapping都可以根据URL不同配置单独的 CorsConfiguration。一般来说应用会通过Java Config或者Xml 命名空间来配置单一,全局的CORS。 HandlerMapping级别的全局CORS配置可以和handler级别的CORS合并。例如有注解的controller可以使用类或者方法级别的注解@CrossOrigin配置跨域。 @CrossOrigin注解可以在controller层启动对请求的跨域检查,例如:

 

@RestController

@RequestMapping("/account")

public class AccountController {

 

    @CrossOrigin

    @GetMapping("/{id}")

    public Account retrieve(@PathVariable Long id) {

        // ...

    }

 

    @DeleteMapping("/{id}")

    public void remove(@PathVariable Long id) {

        // ...

    }

}

默认情况下@CrossOrigin的作用如下:

允许所有的域

允许所有header

允许controller映射的方法

allowedCredentials 默认关闭

max-age默认30分钟 @CrossOrigin同样支持类级别:

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)

@RestController

@RequestMapping("/account")

public class AccountController {

 

    @GetMapping("/{id}")

    public Account retrieve(@PathVariable Long id) {

        // ...

    }

 

    @DeleteMapping("/{id}")

    public void remove(@PathVariable Long id) {

        // ...

    }

}

@CrossOrigin同时可以在类和方法中使用:

 

@CrossOrigin(maxAge = 3600)

@RestController

@RequestMapping("/account")

public class AccountController {

 

    @CrossOrigin("http://domain2.com")

    @GetMapping("/{id}")

    public Account retrieve(@PathVariable Long id) {

        // ...

    }

 

    @DeleteMapping("/{id}")

    public void remove(@PathVariable Long id) {

        // ...

    }

}

通过定义全局的CORS配置,来配合使用。全局的CORS配置可以通过Java Config或者XML的XNM命名空间来配置。 默认情况下全局的CORS配置:

 

允许所有的域

允许所有的header

允许GET,HEAD,POST方法

allowedCredentials 默认关闭

max-age默认30分钟 使用Java配置CORS

@Configuration

@EnableWebMvc

public class WebConfig implements WebMvcConfigurer {

 

    @Override

    public void addCorsMappings(CorsRegistry registry) {

 

        registry.addMapping("/api/**")

            .allowedOrigins("http://domain2.com")

            .allowedMethods("PUT", "DELETE")

            .allowedHeaders("header1", "header2", "header3")

            .exposedHeaders("header1", "header2")

            .allowCredentials(true).maxAge(3600);

 

        // Add more mappings...

    }

}

使用XML配置CORS

 

 

    

        allowed-origins="http://domain1.com, http://domain2.com"

        allowed-methods="GET, PUT"

        allowed-headers="header1, header2, header3"

        exposed-headers="header1, header2" allow-credentials="true"

        max-age="123" />

 

    

        allowed-origins="http://domain1.com" />

 

 

另外,也可以通过CorsFilter配置CORS。

 

CorsConfiguration config = new CorsConfiguration();

 

// Possibly...

// config.applyPermitDefaultValues()

 

config.setAllowCredentials(true);

config.addAllowedOrigin("http://domain1.com");

config.addAllowedHeader("");

config.addAllowedMethod("");

 

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

source.registerCorsConfiguration("/**", config);

 

CorsFilter filter = new CorsFilter(source);

    看完了本文关于Spring MVC过滤器作用的讲解,相信小伙伴们已经迫不及待地想要了解更多Spring MVC过滤器Filter的使用方法,在本站的Spring MVC视频教程中有很详细额讲解,欢迎小伙伴们前去学习!

 

 

 

 

0人推荐
共同学习,写下你的评论
0条评论
上善若水
程序员上善若水

16篇文章贡献85593字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消