2016-04-22 10 views
4

を無視して呼び出します。私はここにある特定の例外に焦点を当てたことだし、それはによってスローされAccessDeniedExceptionある春のセキュリティ - Ajaxは私がこのように定義されたすべての例外を処理する私のプロジェクトでは、コントローラ持っ@ExceptionHandler

@ControllerAdvice 
public class GlobalExceptionHandlingController { 

    @ResponseBody 
    @ExceptionHandler(value = AccessDeniedException.class) 
    public ResponseEntity accessDeniedException() { 
     Logger.getLogger("#").log(Level.SEVERE, "Exception caught!"); 
     return new ResponseEntity("Access is denied", HttpStatus.FORBIDDEN); 
    } 

} 

を許可されていないリクエストに対するSpring Security。これは「通常の」別名非Ajaxリクエストに対して正しく機能しています。私はリンクをクリックするか、ロケーションバーにURLを直接入力することができます。リクエストが許可されていない場合は、このメッセージが表示されます。

しかし、AJAXリクエスト(Angularを使用)では、応答として標準403エラーページが表示されますが、面白いのは、このコントローラでAccessDeniedExceptionが検出されたことがわかります!

私はいくつかの研究を行なったし、私が、私はこれを作ったカスタムAccessDeniedHandlerを持っている必要がありますようだ:

を追加しました私の春のセキュリティの設定でこの行:

.and() 
.exceptionHandling().accessDeniedPage("/error/403/"); 

と私はちょうどに専用コントローラを作りました

@Controller 
public class AjaxErrorController { 

    @ResponseBody 
    @RequestMapping(value = "/error/403/", method = RequestMethod.GET) 
    public ResponseEntity accessDeniedException() { 
     return new ResponseEntity("Access is denied (AJAX)", HttpStatus.FORBIDDEN); 
    } 

} 

これはうまくいきますが、例外はまだ最初のコントローラで捕捉されますが、そのメソッドの戻り値はgettiです無視される。どうして?

これはどのように行われるのですか?私はここで何かを逃していると感じています。

私はSpring 4.2.5とSpring Security 4.0.4を使用しています。

答えて

1

詳細はわかりませんが、私の理論はコンテンツタイプの問題であるということです。

AJAXリクエストを行う場合、レスポンスはJSONにあると予想されるため、ブラウザはAccept: application/jsonヘッダーをリクエストに追加します。一方、

あなたの応答エンティティ:

new ResponseEntity("Access is denied", HttpStatus.FORBIDDEN) 

がテキスト応答である、典型的な春のセットアップと、このデフォルトのContent-Typeはtext/plainです。

Springは、クライアントが望むタイプの応答を配信できないことを検出すると、デフォルトのエラーページにフォールバックします。

関連する問題