我正在尝试捕获Spring安全性流中引发的自定义auth异常(对于过期的密码,这意味着用户可以使用当前凭据来创建新密码,但不能对其进行任何其他操作)并抛出http状态代码419(这不是http规范的一部分,但对我的客户来说更容易处理)。我不能将它放在带有ExceptionHandler的控制器建议类中,因为它只能捕获来自Rest Controller的异常。 我可以在高优先级的自定义过滤器中捕获异常,但是response.setStatus(419)似乎将其设置为401。
创建实现过滤器接口的自定义过滤器,捕获由过滤器链引发的自定义异常,并尝试更改响应状态
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
System.out.println("filtering...");
HttpServletResponse response = (HttpServletResponse) res;
try {
chain.doFilter(req, response);
} catch (ExpiredCredentialsException e) {
System.out.println("Expired credentials exception caught in filter");
response.setStatus(419);
int status = response.getStatus();
System.out.println("status " + status);
}
}
我希望它能打印并返回419,但会打印/返回401。是否有我做错的事情或实现我想要的其他方法?