2016-11-29 28 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

相關問題