有时候前后台做数据交互,会遇到烦人的跨域请求问题,如果你还是一枚编程小白来说,无疑来说是很痛苦的事。
当然网上也肯定会有一些解决方法。但自身实力有限,不一定会看的懂,能把问题解决了。所以下面这篇文章就来给大家总结介绍在Spring MVC中处理ajax请求的跨域问题与一些注意事项,话不多说了,来一起看看详细的介绍吧。
简单的说即为浏览器限制访问一个站点下的js代码对B站点下的url进行ajax请求假。如当前域名是www.abc.com,那么在当前环境中运行的js代码,出于安全考虑,正常情况下不能访问www.zzz.com域名下的资源。
。首先要知道ajax请求的核心是JavaScrip对象和XmlHttpRequest,而浏览器请求的核心是浏览器
从上图可知,ajax每次访问服务器时都没有携带饼干,所以服务器每次都会分配一个新会话的对象,所以ajax默认请求是直接获取不了会话中的数据的。因此,如果我们想要通过ajax获取当前浏览器的会话,我们必须保证每次发送请求都要携带饼干以确保获取的事统一个会话。
进口javax.servlet.http.HttpServletRequest; 进口javax.servlet.http.HttpServletResponse; 进口org.springframework.web.servlet.handler.HandlerInterceptorAdapter;//HandlerInterceptorAdapter//跨域设置 公开课CrossInterceptor延伸HandlerInterceptorAdapter { 公共布尔preHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序){抛出异常 response.addHeader (“Access-Control-Allow-Origin”、“http://localhost: 8080”); response.addHeader (“Access-Control-Allow-Methods”、“*”); response.addHeader (“Access-Control-Max-Age”、“100”); 响应。addHeader (“Access-Control-Allow-Headers”、“内容类型”);//允许客户端发送饼干真表示接收,假不接受默认为假吗? response.addHeader (“Access-Control-Allow-Credentials”,“真正的”); 超级回报。preHandle(请求、响应处理程序); } }
步骤2。设置ajax请求携带饼干
. ajax({美元 url: url + '/checkout.action ', 类型:“得到”, 数据类型:”, 数据:{verifyCode: VerificationCodeInput.value},//添加跨域 异步:假的, xhrFields: { withCredentials:真 }, crossDomain:没错, 成功:功能(数据){ console.log(数据); } });
xhrFields: {withCredentials:真},crossDomain:真的,一定要加上! ! ! !
这样就可以愉快的玩耍了!
基于场景一,已经解决了回话问题但是在使用SpringMVC中
request.getRequestDispatcher (xxxx.html”)。提出(请求、响应); response.sendRedirect (http://www.baidu.com),
会报错。因为当服务器转发或者重定向时返回的是一个页面,因为只有浏览器才能解析显示页面,而ajax的对象却不能,所以会报错错。
<>强解决办法:强>因为ajax请求对象不能解析显示页面,所以不能直接转发或重定向,这时我们需要绕过服务器,直接使用浏览器跳转页面,但是对于会话过期(用户没有登陆)我们要给浏览器一个反馈,我们可以给浏览器一个大于等于600的错误码
字符串requestType=request.getHeader (“X-Requested-With”); 如果(requestType !=零,,“XMLHttpRequest”.equalsIgnoreCase (requestType.trim ())) {//如果是ajax请求就设置一个自定义响应头 响应。setHeader (“sessionStatus”、“超时”);//设置错误码以及错误码提示 响应。sendError(666年,“会话超时”); 返回错误; }Spring MVC中处理ajax请求的跨域问题与注意事项详解