我编写了一个Servlet过滤器,试图从中获取自定义header = samlRequest的值,从其余的客户端/邮递员chrome插件中获取了samlRequest的值,但是使用ajax调用我提供了samlRequest键及其值,但是在java我在“ Access-Control-Request-Headers”中获得唯一的关键samlRequest,如何获取samlRequest的值。

$.ajax({
             url: "http://indlin500.corp.test.com:31000/test/Portal/index.html",
             type: "GET",
             headers: { 'samlRequest': 'eJzVWVlz4roSfs6/oJhHJvECBkMRTsk2+2ow68stY8u2wBuWjQ2//srsyUlmJufOramTSjm41f '},
             beforeSend: function(xhr){xhr.setRequestHeader('samlRequest', 'eJzVWVlz4roSfs6/oJhHJvECBkMRTsk2+2ow68stY8u2wBuWjQ2//srsyUlmJufOramTSjm41f ');},
             success: function() { alert('Success!' + authHeader); }
    });



  FirewalledRequest [
  weblogic.servlet.internal.ServletRequestImpl@4f839843 [选项
  /testsOSS/Portal/index.html HTTP / 1.1连接:保持活动状态
  访问控制请求方法:GET来源:http://10.19.121.17:7001
  用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36
  (KHTML,例如Gecko)Chrome / 55.0.2883.87 Safari / 537.36
  访问控制请求标头:授权,samlrequest,
  x-partnerkey接受:/ DNT:1推荐人:
  http://10.19.121.17:7001/authentication-uxf-login-0.0.1-SNAPSHOT/customLoginPage.html接受编码:gzip,deflate,sdch接受语言:en-US,en; q = 0.8
  ]]


使用chrome rest客户插件,我在标题中得到samlRequest,其值与我提供的值相同。


  FirewalledRequest [
  weblogic.servlet.internal.ServletRequestImpl@24d746a [GET
  /testOSS/Portal/index.html HTTP / 1.1连接:保持活动状态
  缓存控制:无缓存saml请求:eJzVWVlz4roSfs6 / oJhHJvECBkMRTsk2 + 2ow68stY8u2wBuWjQ2 // srsyUlmJufOramTSjm41f用户代理:Mozilla / 5.0
  (Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)
  Chrome / 55.0.2883.87 Safari / 537.36邮递员令牌:
  ce7765d0-94b5-a1e1-d6ba-2abada3dfdd6接受:/ DNT:1
  接受编码:gzip,deflate,sdch接受语言:en-US,en; q = 0.8
  
  ]]

最佳答案

当您从浏览器发出跨域请求时,浏览器会在实际请求之前发出预检请求。与预期的GET请求不同,这是一个OPTIONS请求。

尝试在实际过滤器之前添加CORS过滤器,该过滤器将针对任何OPTIONS请求回复OK。示例代码可以在这里找到:

https://amodernstory.com/2014/12/27/using-cors-headers-with-java-example/

顺便说一句,您不需要在请求中设置标头两次。您可以从ajax请求中删除beforeSend块。

10-08 08:02