HandlerMethod给出了一个HttpRequest?

时间:2011-05-06 06:44:54

标签: spring-mvc

我有一个拦截器,其中我想基于控制器方法上的注释(不在控制器类上)执行一些拦截逻辑。假设只想限制某些用户对该控制器方法的访问。有没有办法在HandlerInterceptor中获取Handler方法(是的,不是处理程序类)?

4 个答案:

答案 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)

首先,这是针对MVC架构模式的。 MVC架构是一种希望

的架构模式
  
    

从用户界面(输入和呈现)中隔离“域逻辑”(用户的应用程序逻辑),允许每个(关注点分离)的独立开发,测试和维护。

  

请参阅here

控制器有很棒的工作。它希望脱钩,专注于设计,等等。我希望软件开发人员不要放弃GRASP:/