如何使用弹簧过滤器返回自定义的http状态代码?

时间:2019-01-16 17:25:21

标签: java spring spring-boot servlet-filters

我正在尝试捕获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。是否有我做错的事情或实现我想要的其他方法?

0 个答案:

没有答案