Ajax跨域问题:跨域请求设置withCredentials

转: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);  
    }

总结:
问题虽然解决了,但里面的所涉及的东西不是很懂,只能有空再了解了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值