前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC 教程 - Filter

SpringMVC 教程 - Filter

作者头像
代码拾遗
发布2018-07-24 15:55:06
6580
发布2018-07-24 15:55:06
举报
文章被收录于专栏:代码拾遗代码拾遗
简介

spring-web模块提供了许多非常实用的Filter

HTTP PUT FORM

浏览器只能通过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数据。

重定向头

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

Shallow ETag

ShallowEtagHeaderFilter为ETG提供了过滤器,关于ETAG将在视图技术中详细解释。

CORS

通过controller的注解Spring MVC对CORS提供了详细的支持。在和Spring Sercurity一同使用的时候CorsFilter必须排在Spring Sercurity的过滤器之前。

关于CORS

由于安全原因,浏览器禁止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层启动对请求的跨域检查,例如:

代码语言:javascript
复制
@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
代码语言:javascript
复制
<mvc:cors>

    <mvc:mapping path="/api/**"
        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" />

    <mvc:mapping path="/resources/**"
        allowed-origins="http://domain1.com" />

</mvc:cors>

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

代码语言:javascript
复制
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);
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码拾遗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • HTTP PUT FORM
  • 重定向头
  • Shallow ETag
  • CORS
  • 关于CORS
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档