2017-10-19 98 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