2017-10-19 92 views
-2

我有一個自定義的註釋是這樣的:如何在Spring @ExceptionHandler中捕獲自定義註釋?

@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
@Documented 
@PreAuthorize(AllowedForSystemUsers.condition) 
public @interface AllowedForSystemUsers { 
    String condition = "hasAnyRole({'ROLE_ADMIN', 'ROLE_USER'})"; 
} 

,我把註釋在我Controller方法是這樣的:

@RequestMapping(value="/search", method=RequestMethod.POST) 
@AllowedForSystemUsers 
public String searchRooms(@ModelAttribute Booking booking, Model model, long type) { 

    //do something 
} 

ExceptionHandler這樣的:

@ExceptionHandler(value = AccessDeniedException.class) 
public ModelAndView accessDenied(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) { 

    return new ModelAndView("redirect:/error"); 
} 

所以當用戶沒有身份驗證ROLE_ADMINROLE_USERAccessDeniedException發生和co去運行accessDenied()方法。

我的問題是我怎麼知道@AllowedForSystemUsers註釋是否觸發這AccessDeniedException?其他代碼也可能觸發AccessDeniedException

謝謝!

+0

您需要在控制器中拋出異常。爲了執行全局異常處理程序,您需要從其他地方拋出異常。 –

+0

你可以考慮在'@ AllowedForSystemUsers'處理中創建'AccessDeniedException'的子類,並拋出它。例如,在@SungJinSteveYoo中處理 –

+0

? – YOUNG

回答

1

系統不應該給用戶任何提示,爲什麼他沒有被授權。他根本沒有被授權。這是一個安全問題。此外,不是管理員的用戶根本無法在前端調用任何管理員操作。這是一個可用性問題。

你想以下(包括你的問題在接下來的時間上下文信息):

我希望讓用戶看到了預訂按鈕,可以搜索可用客房 即使他沒有登錄,但是當他想要預訂房間,他得到 like請登錄後發表評論

這絕對沒問題。如果當前未登錄的用戶正在按下Book按鈕,則必須假定服務器將以401 HTTP code作爲響應。在您的前端,您只需對此響應狀態碼作出反應,向用戶顯示信息,顯然未登錄或無論您想做什麼。絕對沒有必要,服務器需要告訴你他爲什麼迴應401