我有一个拦截器,其中我想基于控制器方法上的注释(不在控制器类上)执行一些拦截逻辑。假设只想限制某些用户对该控制器方法的访问。有没有办法在HandlerInterceptor中获取Handler方法(是的,不是处理程序类)?
答案 0 :(得分:3)
我不敢。您必须在一个(或几个)类中对所需的方法进行分组,并根据类而不是方法进行检查。
我猜你可以自己解析注释并匹配路径,或者试着看看Spring在其类中做了什么,但这会更复杂,容易出错。
您可以尝试(但我没有使用它,因此我不知道它是否有效)方法上的@Interceptors
注释(saw it here)
答案 1 :(得分:3)
你现在可以在Spring 3.1中做到这一点:
public class ApiSecurityInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod method = (HandlerMethod) handler;
Api methodAnnotation = method.getMethodAnnotation(Api.class);
if (methodAnnotation != null) {
// this method is an @Api, we check the credentials
// you can do other things with annotation parameters at this point too
}
}
}
然后将其映射到servlet-config.xml
:
<?xml version="1.0" encoding="UTF-8"?>
...
<mvc:interceptors>
<bean class="com.orderpipe.prototype.server.web.interceptors.ApiSecurityInterceptor"/>
</mvc:interceptors>
然后在你的实际控制器中:
@Controller
@RequestMapping(value = "/api-service")
public class AccountApiController {
@Api(type=CredentialType.OAUTH)
@RequestMapping(value="get", method = RequestMethod.GET)
public String get(Model model) {
// secured method via oauth, for example
// in a simpler example, you'd not have the parameter for credential type.
}
}
我用它来实现特殊的servlet路径,这些路径实现了与普通应用程序不同的安全机制,例如/ api使用oAuth凭据。
答案 2 :(得分:1)
我有同样的需要。
我认为Spring MVC促使使用控制器方法来处理请求是不一致的,但HandlerInterceptor接口不提供将处理请求作为参数的处理程序方法;只有控制器对象。
请求是在方法级别处理的,它是您需要拦截的方法执行,为了有效地执行该操作,您需要访问方法元信息,例如,在方法级别声明的自定义注释或其论点。
HandlerInterceptor.preHandle签名应该是:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handlerInstance, Method handlerMethod)
throws Exception;
这样你就可以做到这样的事情:
hadlerMethod.getAnnotation(MyCustomAnnotation.class);
GOT IT?
在我的情况下,我想实现索引 - 参数映射; STRIPES FRAMEWORK有(或闪存范围)。
我是否必须使用AspectJ来实现我的横切功能? DISSAPOINTING!
答案 3 :(得分:-1)