2017-09-09 3 views
1

ユーザーが接続されているかどうかを確認するためにフィルターを使用しています(トークンは有効です)。トークンが有効でない場合はエラーの詳細を「エラー」という属性を設定しました。例外は、私が取得され、ここでスプリングブートコントローラーの問題

 @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をここ

@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"; 

} 

そして、私のコントローラが私のフィルタです。 応答がコミットされた後でsendError()を呼び出せません at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) 〜[tomcat-embed-core-8.5.16.jar:8.5.16 ] at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotReadable(DefaultHandlerExceptionResolver.java:386) 〜[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE] at ..この条件が真であるelseブロック内

答えて

1

どちらのは、右の第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

::com.inconso.LoginFilter.doFilter(LoginFilter.java:67)[NAクラス/]で ....chain.doFilter()を2回呼び出しています。 elseブロックの終わりに

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

目と2回目:一度このブロックで

いずれかの底から最後chain.doFilter(request, response)を削除するように、一度

else { 

    ... 

    chain.doFilter(req, res); 
} 

で十分ですそうでない場合は、ブロック内の他の場所にあるifおよびcatch句からブロックchain.doFilter(request, response)をブロックするか削除します。

関連する問題