Access-Control-Expose-Headers配置用于自定义响应头的AngularJS

8
我正在为某个资源实现自定义响应头,在阅读类似问题后,我在我的CORS头中添加了“Access-Control-Expose-Headers”,但我可能没有正确配置某些内容。
这是我在获取该资源的GET请求时收到的标头:我收到一个名为“Steve”的“Response-Header”,这应该是由“Access-Control-Expose-Headers”允许的。
Access-Control-Allow-Headers:x-requested-with, Request-Header, Response-Header
Access-Control-Allow-Methods:POST, GET, OPTIONS, DELETE
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Response-Header
Response-Header:Steve

但是,Angular仍然无法访问该自定义标头。我收到了我的自定义请求标头,但没有收到我的自定义响应标头:

{
  "data": {
    "id": 2,
    "content": "Hello, frank!"
  },
  "status": 200,
  "config": {
    "method": "GET",
    "transformRequest": [
      null
    ],
    "transformResponse": [
      null
    ],
    "url": "http:\/\/localhost:8080\/greeting",
    "headers": {
      "Accept": "application\/json, text\/plain, *\/*",
      "Request-Header": "frank"
    }
  },
  "statusText": "OK"
}

Angular 1.3 $httpProvider.interceptor:

'use strict';
angular
  .module('headerDemoUiApp')
  .factory('AuthInterceptor', function AuthInterceptor(nameService) {

    return {
      request: handleRequest,
      response: handleResponse
    };

    function handleRequest(config) {
      if (angular.isDefined(config.headers)) {
        config.headers['Request-Header'] = "frank";
      }
      return config;
    }

    function handleResponse(response) {
      console.log('Response: ' + JSON.stringify(response));

      if (angular.isDefined(response.config.headers['Response-Header'])) {
        var respHead = response.config.headers['Response-Header'];
        console.log('Response-Header: ' + respHead);
        nameService.responsename=respHead;
      }
      return response;
    }

  });

而且,Spring 4.1.6版本的@RestController添加了头部信息。

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(
            @RequestParam(value = "name", defaultValue = "World") String name,
            HttpServletResponse response,
            @RequestHeader("Request-Header") String headerName) {

        // Sets our custom response header
        response.setHeader("Response-Header","Steve");

        return new Greeting(counter.incrementAndGet(),
                String.format(template, headerName));
    }
}

API代码仓库

UI代码仓库

感谢您的查看!

2个回答

3

问题出在您的API GreetingController.java 上。

请将问候方法改为返回ResponseEntity并使用HttpHeaders,如下所示:

@RequestMapping("/greeting")
    public ResponseEntity<Greeting> greeting(@RequestParam(value = "name", defaultValue = "World") String name, @RequestHeader("Request-Header") String headerName) {

        MultiValueMap<String, String> headers = new HttpHeaders();
        // Sets our custom response header
        headers.add("Response-Header","Steve");
        return new ResponseEntity<Greeting>(new Greeting(counter.incrementAndGet(),String.format(template, headerName)), headers, HttpStatus.OK); 
    }

以下是我在Postman客户端收到的头部响应:
Content-Length → 2
Content-Type → text/plain;charset=UTF-8
Date → Wed, 27 May 2015 15:53:47 GMT
Response-Header → Steve
Server → Apache-Coyote/1.1

看起来就是这样!如果你只发送有效负载而不是整个ResponseEntity,Spring就无法返回标头。谢谢! - A. Weatherwax

0

您需要在列表中设置哪些自定义标头将显示在响应标头上。

 List<String> customHeaders = new ArrayList<String>();
    customHeaders.add("<Custom header name>");
    headers.setAccessControlExposeHeaders(customHeaders);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接