- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Spring 的 HandlerInterceptorAdapter
来处理应用程序计划对以下休息端点进行维护时的情况:/api/authentication
所以我通过扩展HandlerInterceptorAdapter
创建了一个拦截器:
public class MigrationStateInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(someLogic) {
return true
}
response.reset();
response.sendError(HttpStatus.SERVICE_UNAVAILABLE.value());
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
然后我将其添加到我的 InterceptorRegistry
中:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MigrationStateInterceptor()).addPathPatterns("/api/authentication");
}
问题是,我没有在客户端收到 503(服务不可用)
错误,而是收到 无法加载资源:服务器响应状态为 406( Not Acceptable ) )
正如代码片段中所示,我尝试重置响应,但没有结果。我还尝试修改 Accept
和 Content-Type
header ,但没有成功:
response.setContentType(MediaType.TEXT_PLAIN_VALUE);
response.addHeader("Accept", "text/plain");
知道为什么会发生这种情况以及如何避免这种情况吗?
注意:我在客户端使用 Angular。据我所知, HttpServletResponse#sendError
将内容类型设置为 text/html
,保留 cookie 和其他 header 不变。这会是一个问题吗?
编辑:我什至尝试抛出异常而不是使用 HttpServletResponse#sendError ,并单独处理它,但最终结果是相同的。
例如:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (some logic) {
return true;
}
throw new MigrationStateException("Migration process is disabled");
}
@ExceptionHandler(MigrationStateException.class)
public ResponseEntity<String> migrationStateError(MigrationStateException e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.SERVICE_UNAVAILABLE);
}
最佳答案
我认为问题是您映射到 /api/authenticate
的请求要么不期望 text/html
,要么您发送了错误类型的请求(即 GET
而不是 POST
等)
您表示 Angular 正在发送 text/html
,考虑到与身份验证端点关联的通常默认值,它可能需要 application/x-www-form-urlencoded
数据。因此,Spring 拦截了一个它没有映射的 Content-Type
并进行 406'ing。
关于java - 使用 Spring 的 HandlerInterceptor 发送错误会导致 406( Not Acceptable )响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36265238/
我是一名优秀的程序员,十分优秀!