2017-09-09 6 views
1

J'utilise un filtre pour vérifier si l'utilisateur est connecté (le jeton est valide), si le jeton n'est pas valide, j'ai défini un attribut appelé "erreur" avec les détails de l'erreur, voici mon contrôleurProblème de contrôleur de démarrage de ressort

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

} 

et voici mon filtre:

 @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); 
      } 
     } 

et voici l'exception je reçois:

java.lang.IllegalStateException: Impossible d'appeler sendError() après que la réponse a été validée sur org.apache.catalina.connector.ResponseFacade.sendError (ResponseFacade.java:472) ~ [tomcat-embed-core-8.5.16.jar: 8.5.16 ] à org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotReadable (DefaultHandlerExceptionResolver.java:386) ~ [printemps-webmvc-4.3.10.RELEASE.jar: 4.3.10.RELEASE] à .. . .... à com.inconso.LoginFilter.doFilter (LoginFilter.java:67) [classes /: na]

Répondre

1

Soit ajouter une déclaration de retour juste après la première chain.doFilter(request, response); - approche de retour précoce

   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 
       } 

OU (IF-ELSE approche Ladder)

// 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

Dans le bloc else où cette condition est remplie: authHeader == null || !authHeader.startsWith("Bearer ") vous appelez deux fois chain.doFilter().

Une fois dans ce bloc:

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

Et une deuxième fois à la fin du bloc else:

else { 

    ... 

    chain.doFilter(req, res); 
} 

Une fois suffit donc soit supprimer le dernier chain.doFilter(request, response) du fond du sinon, bloquez ou supprimez chain.doFilter(request, response) des clauses if et catch ailleurs dans ce bloc.