我打算为 Spring MVC 控制器方法编写自己的 @RoleRestricted 注释,以便像 Spring Security 这样的东西。我想稍后集成到 Spring Security,但现在,我必须有自己的解决方案。另外,这也是一个学习问题。
我HandlerInterceptor
在 Spring 3.2 中使用 a ,所以 myObject handler
是HandlerMethod
.
现在,我想要实现的是能够在一些注释的参数中使用 SpEL 表达式,这通常工作得很好,将hm.getBean()
作为根 bean 用于 SpEL 评估上下文。
如果能够将处理程序方法参数也用作 SpEL 变量,那就太好了!例如,可以将 languageId 指定为请求参数并成为处理程序参数@RequestParam
。
当从方法参数值生成密钥时,我试图查看 Spring 缓存的方法,但我发现这段代码传递了一个来自某个 org.aopalliance 包中的方法的代码Object[] args
。invoke()
有没有办法获得Object[] args
只使用 Spring AOP?
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;
}