Spring security 返回HTTP错误401代码&;跳过过滤链

Spring security 返回HTTP错误401代码&;跳过过滤链,spring-security,Spring Security,使用定制的Spring安全过滤器,如果HTTP头不包含特定的键值对,我想返回HTTP401错误代码 例如: public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) r

使用定制的Spring安全过滤器,如果HTTP头不包含特定的键值对,我想返回HTTP401错误代码

例如:

public void doFilter(ServletRequest req, ServletResponse res,
                     FilterChain chain) throws IOException, ServletException {

   HttpServletRequest request = (HttpServletRequest) req;
   final String val = request.getHeader(FOO_TOKEN)

   if(val == null || !val.equals("FOO")) {
       // token is not valid, return an HTTP 401 error code
       ...
   }
   else {
    // token is good, let it proceed
    chain.doFilter(req, res);
   }
据我所知,我可以做到以下几点:

(1)
((HttpServletResponse)res).设置状态(401)
并跳过剩余的过滤器链

(2) 抛出一个异常,最终导致Spring Security向客户端抛出401错误

如果#1是更好的选项,那么在对响应调用
setStatus(401)
后,如何跳过筛选链

或者,如果#2是正确的方法,我应该抛出哪个异常?

从中,您可以:

  • 或者使用FilterChain对象(chain.doFilter())调用链中的下一个实体
  • 不将请求/响应对传递给筛选器链中的下一个实体以阻止请求处理

因此,设置响应状态代码并立即返回,而无需调用chain.doFilter是实现此目的的最佳选择。

我建议以下解决方案

public void doFilter(ServletRequest req, ServletResponse res,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        final String val = request.getHeader(FOO_TOKEN)

        if (val == null || !val.equals("FOO")) {
            ((HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED, "The token is not valid.");
        } else {
            chain.doFilter(req, res);
        }
    }

照上面答案说的做就行了。“因此,设置响应状态代码并立即返回” 这只是类型:

res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);  
return;

所以你可以用这样的东西

@Override
public void doFilter() {
    if (whiteListOrigins.contains(incomeOrigin)) {
        httpResponse.setHeader("Access-Control-Allow-Origin", incomeOrigin);
        chain.doFilter(request, response);
    } else {
        ((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Not Allowed to Access. Please try with valid Origin.");
    }
}

如果在
setStatus
之后从方法返回,则停止进一步处理请求。只有在调用
chain.doFilter
时,筛选链才会继续。谢谢。我试试看。帖子作为答案?您还可以发布一个引用,以便我可以阅读更多内容吗?您可能希望实现一个AuthenticationEntryPoint,如下所示:它可以工作,但在日志
java.lang.IllegalStateException:Cannotcall sendError()中会出现此错误在提交响应后
。它会给出以下错误java.lang.IllegalStateException:在提交响应后无法调用sendError()。