2017-09-09 228 views
1

我正在使用过滤器来检查用户是否连接(令牌有效),如果令牌不是有效的我设置了一个名为“错误”的属性与错误的详细信息,这里是我的控制器弹簧引导控制器问题

@RestController 
public class HomeController { 


@RequestMapping(value = "secure/info", method = RequestMethod.POST) 

public Object login(@RequestBody User user,@RequestAttribute(name="error") AppError error) { 

    if(error!=null) return error ; 
    return "information"; 

} 

这里是我的过滤器:

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

      final HttpServletRequest request = (HttpServletRequest) req; 
      final HttpServletResponse response = (HttpServletResponse) res; 
      final String authHeader = request.getHeader("authorization"); 

      if ("OPTIONS".equals(request.getMethod())) { 
       response.setStatus(HttpServletResponse.SC_OK); 

       chain.doFilter(request, response); 
      } else { 

       if (authHeader == null || !authHeader.startsWith("Bearer ")) { 
        AppError error = new AppError("0001","Invalid bearer token."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 
       } 

       final String token = authHeader.substring(7); 

       try { 
        final Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody(); 
        request.setAttribute("claims", claims); 
       } catch (final SignatureException e) { 
        AppError error = new AppError("0002","Invalid token signature."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 
       } 
       catch (final ExpiredJwtException e) { 
        AppError error = new AppError("0003","Expired token."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 

       } 

       catch (final MalformedJwtException e) { 
        AppError error = new AppError("0004","Malformed token."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 
        //return ; 
       } 



       chain.doFilter(req, res); 
      } 
     } 

这里是例外,我得到:

java.lang.IllegalStateException:在 响应已提交 位于org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) 〜[tomcat-embed-core-8.5.16.jar:8.5.16之后无法调用sendError() ] 在org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotReadable(DefaultHandlerExceptionResolver.java:386) 〜[弹簧webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE] 在.. 。 .... 在com.inconso.LoginFilter.doFilter(LoginFilter.java:67)[类/:NA]

回答

1

要么第一chain.doFilter(request, response);之后加一个return语句 - 早日回归方法

   if (authHeader == null || !authHeader.startsWith("Bearer ")) { 
        AppError error = new AppError("0001","Invalid bearer token."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 

        // ADD a RETURN STATEMENT HERE 
       } 

OR(IF-ELSE阶梯式教学法)

// START: MOVE THIS inside AN ELSE Block 

       final String token = authHeader.substring(7); 

       try { 
        final Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody(); 
        request.setAttribute("claims", claims); 
       } catch (final SignatureException e) { 
        AppError error = new AppError("0002","Invalid token signature."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 
       } 
       catch (final ExpiredJwtException e) { 
        AppError error = new AppError("0003","Expired token."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 

       } 

       catch (final MalformedJwtException e) { 
        AppError error = new AppError("0004","Malformed token."); 
        request.setAttribute("error", error); 
        chain.doFilter(request, response); 
        //return ; 
       } 
// END: MOVE THIS inside AN ELSE Block 
1

else块,其中该条件为真:authHeader == null || !authHeader.startsWith("Bearer ")两次调用chain.doFilter()

一旦处于该块:

if (authHeader == null || !authHeader.startsWith("Bearer ")) { 
    AppError error = new AppError("0001","Invalid bearer token."); 
    request.setAttribute("error", error); 
    chain.doFilter(request, response); 
} 

而第二次在else块的末尾:

else { 

    ... 

    chain.doFilter(req, res); 
} 

一旦足够所以无论是从所述底部移除最后chain.doFilter(request, response)否则阻止或删除该块中其他位置的if和catch子句中的chain.doFilter(request, response)