Access-Control-Expose-Headers 自定义响应配置 Headers AngularJS
Access-Control-Expose-Headers Configuration for Custom Response Headers AngularJS
我正在资源上实现自定义响应 header,在 reading over a similar question 之后,我向我的 CORS header 添加了一个 'Access-Control-Expose-Headers',但我不能有正确配置的东西。
这是我在资源的 GET 请求中收到的 header:我收到 "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 仍然无法访问该自定义 header。我取回了我的自定义 Request-Header,但没有取回我的自定义 Response-Header:
{
"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 添加了 header.
@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 GreetingController.java
将问候方式改为returnResponseEntity并使用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 客户端的 headers 回复
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
您必须在列表中设置响应 headers 时将公开的自定义 headers。喜欢:
List<String> customHeaders = new ArrayList<String>();
customHeaders.add("<Custom header name>");
headers.setAccessControlExposeHeaders(customHeaders);
我正在资源上实现自定义响应 header,在 reading over a similar question 之后,我向我的 CORS header 添加了一个 'Access-Control-Expose-Headers',但我不能有正确配置的东西。
这是我在资源的 GET 请求中收到的 header:我收到 "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 仍然无法访问该自定义 header。我取回了我的自定义 Request-Header,但没有取回我的自定义 Response-Header:
{
"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 添加了 header.
@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 GreetingController.java
将问候方式改为returnResponseEntity并使用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 客户端的 headers 回复
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
您必须在列表中设置响应 headers 时将公开的自定义 headers。喜欢:
List<String> customHeaders = new ArrayList<String>();
customHeaders.add("<Custom header name>");
headers.setAccessControlExposeHeaders(customHeaders);