正确处理spring-oauth-server中在验证失败或错误时的方式

在文章 https://andaily.com/blog/?p=97 中提到了OAUTH验证失败或错误时的处理办法, 但该方式是不完美的.

通过剖析代码发现,为什么在浏览器中会返回XML格式的数据, 而在使用类似HttpClient的请求时返回的数据格式为JSON,

其实所有的根源都在于请求header中的Accept的值所决定的,如果Accept不支持application/json, 那服务端肯定不会返回JSON格式的数据,

通过浏览器的开发者工具很容易追踪,如下图:

web_response_xml

 

从图中可以看出我们在请求时header中Accept的值为:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8; 服务器响应401

没有json格式的 media type, 但有xml的, 所以返回的数据格式不会是JSON的在浏览器请求时, 同时请注意 response header中的WWW-Authenticate.

 

相同的请求,如果我们换一种方式, 如Postman, 其结果返回的却是JSON格式的.如下图:

postman_response_json1

 

这也是因为请求时的header中Accept导致的, 看下图:

postman_response_json2

 

Postman在请求时的Header中设置了Content-Type: application/json; 同时也注意WWW-Authenticate.

 

综上分析, 你应该知道如何在请求时设定响应时的数据格式了吧. 方法如下:

1. 如果能指定Header中的Accept或Content-Type, 则指定为具体的数据类型或 media type  (一般用在非浏览器环境)

2.不管返回的数据体(response body)是XML还是JSON, 通过响应的header来处理, 如果响应码不是200, 则获取Header中WWW-Authenticate的值.

通过解析WWW-Authenticate的值来获取错误信息 (适用几乎所有环境)

 

 

http://git.oschina.net/shengzhao/spring-oauth-server

Leave a Comment.