龙空技术网

Spring处理跨域请求

struggledhard 905

前言:

现在咱们对“springmvc跨域请求”都比较关切,看官们都需要分析一些“springmvc跨域请求”的相关内容。那么小编也在网摘上汇集了一些对于“springmvc跨域请求””的相关资讯,希望大家能喜欢,我们一起来了解一下吧!

@CrossOrigin 注解

@CrossOrigin 注解在控制器方法上启用:

@RestController@RequestMapping("/account")public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... }}

默认的 @CrossOrigin 启用以下功能:

All origins. 所有请求源,向该服务器提交请求的URIAll headers. 全部的访问头信息All HTTP methods to which the controller method is mapped. 控制器方法映射到的所有HTTP方法。allowedCredentials is not enabled by default since that establishes a trust level that exposes sensitive user-specific information such as cookies and CSRF tokens, and should only be used where appropriate.allowedCredentials 默认情况下未启用,因为它建立了一个信任级别,用于公开敏感的用户特定信息,如Cookie和CSRF令牌,并且只能在适当的情况下使用。maxAge is set to 30 minutes.maxAge 设置为30分钟。预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了

@CrossOrigin 也在类级别上得到支持,并由所有方法继承:

@CrossOrigin(origins = "", 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("") @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... }}
全局配置

Java配置

要在MVC Java配置中启用CORS,请使用CorsRegistry回调:

@Configuration@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("") .allowedMethods("PUT", "DELETE") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(true).maxAge(3600); // Add more mappings... }}

XML配置

要在XML命名空间中启用CORS,使用 <mvc:cors> 元素:

<mvc:cors> <mvc:mapping path="/api/**" allowed-origins=", " 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="" /></mvc:cors>
CORS过滤器

可以通过内置的CorsFilter来应用CORS支持。

Configurationpublic class CorsConfig { @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 允许cookies跨域 config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin config.addAllowedHeader("*");// #允许访问的头信息,*表示全部 config.setMaxAge(3600L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了 config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); }}
其他使用jsonp来进行跨域,但不太安全。后台response添加header,response.setHeader("Access-Control-Allow-Origin", "*");
@Controller public static class TestController {  @RequestMapping(value = "/test")  @ResponseBody  public String getInfo(String id, HttpServletResponse response)  throws Exception {  response.setHeader("Access-Control-Allow-Origin", "*");  //.......  return ".....";  } }

标签: #springmvc跨域请求