Java 跨域操作
跨域这个问题确实让人很头疼,对于一般的来说,后台做处理就可以。
一般来说,出现跨域问题只会是前台发送回来的报文头格式不一致所造成的,前台请求一般是两次,第一次是一个OPTIONS的请求,这个请求是一个开路的请求,为后边所访问的方法开辟一条可操作的道路,跨域问题的出现就是因为OPTIONS请求至后台后出现了问题,所以该请求的访问才会出现问题,导致后边的操作无法进行。
1.第一种办法
使用自带的Spring MVC 的跨域操作就可以,因为Spring MVC本身就是连接页面和逻辑的一个中暑按钮,所以不必要自己在给一个自定义的格式。
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-methods="PUT, POST, GET, DELETE, OPTIONS"
allowed-headers="Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild, x-access-token"
allow-credentials="true" />
<mvc:mapping path="/resources/**"
allowed-origins="*" />
</mvc:cors>
2.第二种办法
使用拦截器的方式进行改变报文头,方法请求前进入拦截器,拦截器访问到对应的OPTIONS操作后会进行处理,返回正确格式的报文头。
public class AllowOriginInterceptor implements HandlerInterceptor{
//切面编程:Handler执行之前执行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild, x-access-token");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");// 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求
// 配置options的请求返回
if (httpServletRequest.getMethod().equals("OPTIONS")) {httpServletResponse.setStatus(200);
httpServletResponse.getWriter().write("OPTIONS returns OK");
}return true;
}
}