我打算为Spring MVC控制器方法编写自己的@RoleRestricted注释,以便像Spring Security那样。我想稍后集成到Spring Security,但是现在,我必须拥有自己的解决方案。另外,这也是一个学习问题。
我在Spring 3.2中使用HandlerInterceptor
,因此我的Object handler
是HandlerMethod
的实例。
现在,我想要实现的是能够在一些注释的参数中使用SpEL表达式,这通常很有效,使用hm.getBean()
作为根bean用于SpEL评估上下文。
能够将处理程序方法参数用作SpEL变量也是最棒的!例如。可以将languageId指定为请求参数,并使用@RequestParam
成为处理程序参数。
我试着看一下Spring缓存的方法,当从方法参数值生成密钥时,但我发现这些代码传递Object[] args
,来自invoke()
方法一些org.aopalliance包。有没有办法只使用Spring AOP来获取Object[] args
?
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if (handler instanceof HandlerMethod)
{
HandlerMethod hm = (HandlerMethod) handler;
RoleRestricted annotation = hm.getMethodAnnotation(RoleRestricted.class);
if (annotation != null)
{
// Handler method was annotated with an @RoleRestricted annotation.
HttpSession session = request.getSession();
RoleResource resource = annotation.resource();
EvaluationContext context = ???
if (SessionUtils.hasRoleLanguageAccess(annotation.resource(), session, annotation.corporateId(), annotation.languageId()))
{
return true;
}
else
{
logger.debug("Declined access");
response.sendRedirect(response.encodeRedirectURL("/RoleLogin.do?onSuccess=" + URLEncoder.encode(onSuccess, "UTF-8")));
}
}
}
return true;
}