2015-07-18 21 views
12

için özel durum işleme Simgelere dayalı kimlik doğrulamayı (yay güvenliği olmadan) uyguladım. Yani, GenericFilterBean'da, kontrol eder ve iddia eder. Spring GenericFilterBean

public class MyTokenFilter extends GenericFilterBean { 

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

     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     if (!"OPTIONS".equals(request.getMethod())) { 

      String authHeader = request.getHeader("Authorization"); 

      if (authHeader == null || !authHeader.startsWith("Token ")) { 
       throw new MyAuthException("Authorization header needed"); // Should return custom http status response like 400 
      } 

      String token = authHeader.substring(6); 

      try { 
       claimToken(token); 
      } catch (Exception e) { 
       throw new MyAuthException("Invalid token."); // Should return custom http status response like 401 
      } 

     } 

     chain.doFilter(req, res); 

    } 

} 

Yani bu filtrede sonra her şey görünüyor. Fakat farklı Http Statüleri ile json ile yanıt göndermem gerekiyor. ResponseEntitiyExceptionHandler ile @ControllerAdvice'yi kullanabiliyorum. Böylece denetleyicilerimde istisnaları halledebilirim.

@ControllerAdvice 
public class MyPrettyExceptionHandler extends ResponseEntityExceptionHandler { 

    @ExceptionHandler(MyAuthException.class) 
    @ResponseBody 
    public ResponseEntity<Object> handleCustomException(HttpServletRequest req, MyAuthException ex) { 
     Map<String, String> responseBody = new HashMap<>(); 
     responseBody.put("error", "true"); 
     responseBody.put("message", ex.getMessage()); 
     return new ResponseEntity<Object>(responseBody, HttpStatus.INTERNAL_SERVER_ERROR); 
    } 
} 

nasıl çalıştığını bilir ve hangi Filtre ve denetleyicileri ve bunların istisnaları (filtreler kontrolörleri önce kendi iş yapmak, böylece kontrolörler ile aynı kapsam değiliz) sipariş. Bu yüzden doğal olarak ControllerAdvice ile filtrenin istisnalarını ele alamıyorum.

Filtrelerdeki istisnaları işlemenin etkili yolu nedir (örnek yolum gibi)? Bana başka bir yol önerebilir misin?

cevap

7

Sen gönderme hata kodu ve statü için response.sendError kullanmalıdır:

public class MyTokenFilter extends GenericFilterBean { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     if (!"OPTIONS".equals(request.getMethod())) { 

      String authHeader = request.getHeader("Authorization"); 
      if (authHeader == null || !authHeader.startsWith("Token ")) { 
       //throw new MyAuthException("Authorization header needed"); // Should return custom http status response like 400 
       response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Authorization header needed"); 
       return ; 
      } 

      String token = authHeader.substring(6); 
      try { 
       claimToken(token); 
      } catch (Exception e) { 
       //throw new MyAuthException("Invalid token."); // Should return custom http status response like 401 
       response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid token."); 
       return ; 
      } 
     } 
     chain.doFilter(req, res); 
    } 
}