一.简单请求
一个简单的请求大致如下:
HTTP方法是下列之一
HEAD
GET
POST
HTTP头包含
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type,但仅能是下列之一
application/x-www-form-urlencoded
multipart/form-data
text/plain
解决方案:
1.spring mvc JDK1.8 版本为1.8+ spring 4.2+ 可以通过注解
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
常用的属性有2个,分别是origins和maxAge,下面分别解释下:
origins 是一个字符串数组的类型(String []),用于表示那些域名可以访问此接口/映射。多个域名之间用逗号“,”隔开,如果想向所有网址开放,可以直接填写星号“*”。
maxAge 还没有找到官方的说明,其他开发者解释为“预请求的结果的有效期”,即COOKIE的有效期,单位是秒。
@RequestMapping(value = "/api", method = RequestMethod.POST)
注意:请求必须是注明请求类型例如,Get、Post等。
2.spring boot 同上
全局跨域配置:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
二.复杂请求
任何一个不满足上述要求的请求,即被认为是复杂请求。一个复杂请求不仅有包含通信内容的请求,同时也包含预请求(preflight request)。
解决方案:
- 复杂请求浏览器会发去options请求,去验证后台是否支持复杂请求。如何head被自定义等,以下例子为Filter
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "POST,OPTIONS");
resp.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header,Token");
if ("OPTIONS".equals(req.getMethod())) {
resp.setStatus(204);
chain.doFilter(request, resp);
return;
}