Ajax跨域问题:跨域请求设置withCredentials
来源:互联网 发布:重装系统数据恢复 编辑:程序博客网 时间:2024/06/04 19:30
转:http://www.cnblogs.com/zhangcybb/p/6594991.html
最近在做运动城项目,这一个项目下面有多个子项目,如主数据项目,pos项目等。主数据项目的域名为www.topmall.com,POS项目的域名为pos.topmall.com。即两个项目的主域名相同,子域名不相同。
我们的登陆认证是放在主数据项目的,即进入POS项目如果检测未登陆,是先要调用主数据的一个登陆接口登陆后才可以访问的。这时候跨域问题就出现了,进入POS项目之后跳出登陆框,输入用户名密码请求主数据的http://www.topmall.com/signin进行登陆,看到返回的response里面也有Set-cookie,但是再次请求POS项目的http://pos.topmall.com/pos/cashier/info 资源时却报错了。调试进去看发现后台获取不到当前登陆的用户,查看请求头发现并没有把登陆时返回的cookies设置到第二次请求的头里面。
查询资料才知道登陆请求的主数据项目与POS项目不属于同一个子域,即存在跨域,跨域请求想要带上cookies必须在请求头里面加上{crossDomain: true, xhrFields: {withCredentials: true}}设置,于是在index界面加上了如下代码:
<script> $(function () { //, headers: { 'x-requested-with': 'XMLHttpRequest' } $.ajaxSetup({crossDomain: true, xhrFields: {withCredentials: true}}); });</script>
然后在后台代码返回response时做如下处理:
private boolean recharge(HttpServletRequest request, HttpServletResponse response) throws Exception { String url = request.getHeader("Origin"); logger.debug("Access-Control-Allow-Origin:" + url); if (!StringUtils.isEmpty(url)) { String val = response.getHeader("Access-Control-Allow-Origin"); if (StringUtils.isEmpty(val)) { response.addHeader("Access-Control-Allow-Origin", url); response.addHeader("Access-Control-Allow-Credentials", "true"); } } return true; }
再次访问,发现请求头已经可以携带cookies。
——————————————————————————————————————————
参考以上信息对自己的问题进行了相应修改还是报错
The 'Access-Control-Allow-Origin' header contains the invalid value 'sysadmin.sydwl.com'. Origin 'http://sysadmin.sydwl.com' is therefore not allowed access.
原因是后端的response.addHeader(“Access-Control-Allow-Origin”,”sysadmin.sydwl.com”);要改成
response.addHeader(“Access-Control-Allow-Origin”,”http://sysadmin.sydwl.com“);
或者response.addHeader(“Access-Control-Allow-Origin”,”*”);
@SuppressWarnings("unchecked") public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; response.addHeader("Access-Control-Allow-Origin","http://sysadmin.sydwl.com"); response.addHeader("Access-Control-Allow-Credentials", "true"); filterChain.doFilter(request, response); }
总结:
问题虽然解决了,但里面的所涉及的东西不是很懂,只能有空再了解了
- Ajax跨域问题:跨域请求设置withCredentials
- 使用withCredentials发送跨域请求凭据
- 使用withCredentials发送跨域请求凭据
- 使用withCredentials发送跨域请求凭据
- 使用withCredentials发送跨域请求凭据
- 使用withCredentials发送跨域请求凭据
- 在 ajax 跨域请求中携带 cookie 做身份认证 (xhr withCredentials属性)
- Ajax跨域请求后台无法识别session id的解决方式[withCredentials = true]
- 用iframe设置代理解决ajax跨域请求问题
- Ajax 跨域请求问题
- Ajax跨域请求问题
- ajax 跨域请求问题
- ajax请求跨域问题
- ajax请求跨域问题
- Ajax请求跨域问题
- ajax跨域请求问题
- Ajax请求跨域问题
- AJAX跨域请求问题
- gdb打印抽象数据类型vector
- Java语言基础——类与对象
- leetcode之Best Time to Buy and Sell Stock问题
- android国际化
- JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
- Ajax跨域问题:跨域请求设置withCredentials
- node.js---入门学习
- 公办幼儿园教师要涨工资了???
- 来自滕州市全体农村学前教育一线教…
- ds1302
- 手机AT指令 AT+CMGS发信息_…
- Java实现邮箱找回密码
- 彼得-德鲁克的《创新与企业家精神》一书之分享活动收获
- 手机 SMS PDU 格式参考手册