2016-11-29 144 views
1

我有以下问题:我自定义的AuthenticationProvider类,弹簧启动提供,调用REST服务,以使登录在远程服务器上。如何拦截来自REST API中的403个HTTP状态情况下的响应,在Spring类的AuthenticationProvider

如果凭据是正确的,没问题。

问题出现时的凭据是不正确的,服务器响应HTTP状态是403 在实践中,我无法获得响应,因为它会自动升起API其余的异常:

ResponseEntity <UserResponse> resp = restTemplate.exchange (url, HttpMethod.POST, requestEntity, UserResponse.class); 

我试图创建自定义类,以通过 @ControllerAdvice注释捕获异常,但它不能被调用,因为该异常不是在控制器中出现,而是出现在AuthenticationProvider类中。

有没有办法拦截休息API的异常反应?

public class CustomAuthenticationProvider implements AuthenticationProvider { 

private static final Logger log = LoggerFactory.getLogger(CustomAuthenticationProvider.class); 

@Value("${search.login}") 
private String searchLogin; 

@Autowired 
private HttpServletRequest request; 

private DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 

@Override 
public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    User user=new User(); 
    ObjectWriter ow = new ObjectMapper().writer(); 
    String json="log-> "; 
    UserResponse response=new UserResponse(); 
    try { 

       RestTemplate restTemplate = new RestTemplate(); 
       URI url; 
       url = new URI(searchLogin); 
       MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
       map.add("username",URLEncoder.encode(authentication.getName(), "utf-8")); 
       map.add("password",URLEncoder.encode(authentication.getCredentials().toString(), "utf-8")); 
       HttpHeaders requestHeaders = new HttpHeaders(); 
       requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
       List<MediaType> acceptableMediaTypes=new ArrayList<MediaType>(); 
       acceptableMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); 
       requestHeaders.setAccept(acceptableMediaTypes); 
       HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(map,requestHeaders); 
       ResponseEntity<UserResponse> resp = restTemplate.exchange(url, HttpMethod.POST, requestEntity, UserResponse.class); 
       response = resp.getBody(); 

在此先感谢。

+0

什么是你想要做* *?你说你不能“得到回应” - 在哪里?出于什么目的?看起来你正在得到一个正确的答案(403) - 特别是,你想与众不同吗? – chrylis

+0

是的,我得到正确的403,但我想阅读回复并在日志中打印。但是,在春天的框架之前出现以及处理的异常,不能阅读回答。 – Maforast

+0

当你得到403,那么你可以确定发生异常并打印它来记录。是吗 ?或者你可以尝试捕获异常并再次抛出,与@ExcepionHandler结合,也许它可以工作。 –

回答

0

恐怕你将不得不使用Spring Security处理它作为@ControllerAdvice只截取的例外是直接从您的控制器抛出。我认为this link会给你你正在寻找的解决方案。

+0

是的,这应该是如果它是由一个控制器进行调用REST服务正确的答案,但我在的AuthenticationProvider类,任何控制器被称为 – Maforast

-1

你可以尝试在你的休息添加@ExceptionHandler。就像例如 @ExceptionHandler public String exp(HttpServletRequest request, Exception ex) {
//balabala }

+1

之前,这不会工作,因为ControllerAdvice /只的ExceptionHandler例外被直接扔进工作调节器 – Rubasace

相关问题