设定:
使用案例
请求
Request URL:http://localhost:8080/api/info
Request Method:PUT
Status Code:302 Found
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade
accept:application/json
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,sv;q=0.6,ru;q=0.4,uk;q=0.2,fr;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Content-Length:66
Content-Type:application/json
Cookie:_ga=GA1.1.1868465923.1505828166; _gid=GA1.1.612220229.1507272075; session=e4oSW4Kq; prod_user_session=4d6b615f-521704; user_session=g3ggLxJDomyZ
Host:localhost:8080
mode:cors
Origin:http://localhost:8080
Pragma:no-cache
Referer:http://localhost:8080/profile
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
响应:
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Connection:keep-alive
Content-Length:0
Date:Fri, 06 Oct 2017 12:12:26 GMT
Expires:0
Location:http://localhost:8080/login
Pragma:no-cache
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
此响应系统触发PUT请求http://localhost:8080/login
后失败,因为http://localhost:8080/login
请求不允许使用PUT方法。
问题:
我知道我已经获得302状态和Location:http://localhost:8080/login
标题,因为我已经注销了。我希望使用JSON正文对此案例进行扩展响应,或者至少确保在这种情况下我将获得401 Unauthorised
状态代码而不是302.
答案 0 :(得分:1)
如果我正确理解了您的问题,听起来您需要通过常规网页加载(produces="text/html"
)与AJAX调用(produces="application/json"
)进行未经授权的请求的两种不同响应。目前,未经授权的AJAX呼叫被重定向到登录页面,这是一个合法的页面,因此没有401响应代码。以下是使用XML配置Spring Security Ajax login和@Configuration config https://stackoverflow.com/a/27300215/1718213
另一个更加用户友好的选项是使用Spring的WebSocket支持向指定用户可能已打开的所有选项卡发送注销事件(跨所有设备和浏览器),这将触发每个选项卡重定向到登录页面