zoukankan      html  css  js  c++  java
  • spring mvc 跨域请求处理——spring 4.2 以上

    Controller method CORS configuration

    You can add to your @RequestMapping annotated handler method a @CrossOrigin annotation in order to enable CORS on it (by default @CrossOrigin allows all origins and the HTTP methods specified in the @RequestMapping annotation):

    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
    	@CrossOrigin
    	@RequestMapping("/{id}")
    	public Account retrieve(@PathVariable Long id) {
    		// ...
    	}
    
    	@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
    	public void remove(@PathVariable Long id) {
    		// ...
    	}
    }

    It is also possible to enable CORS for the whole controller:

    @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
    	@RequestMapping("/{id}")
    	public Account retrieve(@PathVariable Long id) {
    		// ...
    	}
    
    	@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
    	public void remove(@PathVariable Long id) {
    		// ...
    	}
    }

    In this example CORS support is enabled for both retrieve() and remove() handler methods, and you can also see how you can customize the CORS configuration using@CrossOrigin attributes.

    You can even use both controller and method level CORS configurations, Spring will then combine both annotation attributes to create a merged CORS configuration.

    @CrossOrigin(maxAge = 3600)
    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
    	@CrossOrigin(origins = "http://domain2.com")
    	@RequestMapping("/{id}")
    	public Account retrieve(@PathVariable Long id) {
    		// ...
    	}
    
    	@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
    	public void remove(@PathVariable Long id) {
    		// ...
    	}
    }

    Global CORS configuration

    In addition to fine-grained, annotation-based configuration you’ll probably want to define some global CORS configuration as well. This is similar to using filters but can be declared withing Spring MVC and combined with fine-grained @CrossOrigin configuration. By default all origins and GETHEAD and POST methods are allowed.

    JavaConfig

    Enabling CORS for the whole application is as simple as:

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
    	@Override
    	public void addCorsMappings(CorsRegistry registry) {
    		registry.addMapping("/**");
    	}
    }

    You can easily change any properties, as well as only apply this CORS configuration to a specific path pattern:

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
    	@Override
    	public void addCorsMappings(CorsRegistry registry) {
    		registry.addMapping("/api/**")
    			.allowedOrigins("http://domain2.com")
    			.allowedMethods("PUT", "DELETE")
    			.allowedHeaders("header1", "header2", "header3")
    			.exposedHeaders("header1", "header2")
    			.allowCredentials(false).maxAge(3600);
    	}
    }

    XML namespace

    It is also possible to configure CORS with the mvc XML namespace.

    This minimal XML configuration enable CORS on /** path pattern with the same default properties than the JavaConfig one:

    <mvc:cors>
    	<mvc:mapping path="/**" />
    </mvc:cors>

    It is also possible to declare several CORS mappings with customized properties:

    <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="false"
    		max-age="123" />
    
    	<mvc:mapping path="/resources/**"
    		allowed-origins="http://domain1.com" />
    
    </mvc:cors>

    How does it work?

    CORS requests (including preflight ones with an OPTIONS method) are automatically dispatched to the various HandlerMappings registered. They handle CORS preflight requests and intercept CORS simple and actual requests thanks to a CorsProcessor implementation (DefaultCorsProcessor by default) in order to add the relevant CORS response headers (likeAccess-Control-Allow-Origin). CorsConfiguration allows you to specify how the CORS requests should be processed: allowed origins, headers, methods, etc. It can be provided in various ways:

  • 相关阅读:
    (五)Spring Cloud教程——Config(F版本)
    (四)Spring Cloud教程——Zuul(F版本)
    (三)Spring Cloud教程——Hystrix(F版本)
    (二)Spring Cloud教程——Ribbon 和 Feign(F版本)
    (一)Spring Cloud教程——Eureka(F版本)
    3年的坚持,最终造就著作——《Learninghard C#学习笔记》
    WPF快速入门系列(9)——WPF任务管理工具实现
    WPF快速入门系列(8)——MVVM快速入门
    [WPF实用技巧]如何使WPF的TreeView节点之间有连线
    WPF快速入门系列(7)——深入解析WPF模板
  • 原文地址:https://www.cnblogs.com/yudar/p/4828987.html
Copyright © 2011-2022 走看看