使用Spring MVC可以在控制器本身中定义过滤方法

时间:2011-11-01 14:20:45

标签: spring spring-mvc annotations servlet-filters before-filter

我知道使用Spring MVC可以使用RequestMapping注释来注释整个控制器类。也可以使用Requestmapping注释单独的方法,以便它们的每个请求映射都与整个类的请求映射相关。

如果那时我可以分配控制器的一个方法,作为某种类型的每个控制器过滤器,它会在给定方法的每个相应的动作方法之前执行。是否可能,或者我应该继续使用单独的Filter类的现有方法(这是我希望可以避免的事情)

4 个答案:

答案 0 :(得分:1)

  

如果那时我可以分配一个控制器方法

那就太棒了

不,没有内置的方法来完成这项工作。


但你可以做一个非常脏黑客:在调用控制器方法之前执行一个用@ModelAttribute注释的方法。

Spring Reference:Chapter 15.3.2.8 Providing a link to data from the model with @ModelAttribute

  

请注意

     

@ModelAttribute注释方法在选择之前执行   @RequestMapping带注释的处理程序方法。他们有效   使用经常加载的特定属性预填充隐式模型   来自数据库。然后可以访问这样的属性   通过@ModelAttribute注释处理程序方法参数   选择的处理程序方法,可能应用绑定和验证   它。

但我强烈建议不要这样做,而是使用AOP!

答案 1 :(得分:0)

上述解决方法可能会正常工作,但如果您想拦截方法调用,可能会在控制器或其他任何地方使用方面。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html

寻找

aop:config或@Aspect

此外,对于控制器,拦截器可能会起作用

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor

答案 2 :(得分:0)

听起来你只想对给定控制器内的方法应用一些通用逻辑(否则使用Filter)。如果是这样,为什么不将该逻辑放在私有方法中并从所有请求映射方法中调用它?这将为每个方法添加一行。将方面或拦截器应用于每个方法,无论如何都需要添加至少一行(例如注释)。吻。

答案 3 :(得分:0)

ModelAttribute的目的完全不同。 我们可以通过创建 MethodInterceptor 的自定义拦截器实现(来自 aopalliance )并将其用作 AOP顾问来实现。

在应用程序中为Request控制器类创建一个aop配置,并将其作为顾问程序添加到您为此控制器类创建的连接点。

然后在调用方法之前调用此顾问程序。