Java 某些控制器的Spring mvc过滤器

Java 某些控制器的Spring mvc过滤器,java,spring,spring-mvc,controller,Java,Spring,Spring Mvc,Controller,我需要处理所有到一些Spring控制器的请求,以获得一些请求者信息或抛出异常,比如安全过滤器 我想知道在Spring中是否有一些内置的东西,比如控制器的过滤器(我不需要为所有的控制器使用它,只需要为某个人使用它)。 我不希望通过url请求应用此筛选器,而是使用类/方法扩展或注释 这是我的实际解决方案: @Controller public class MyFilteredController extends FilterController { @RequestMapping("/fi

我需要处理所有到一些Spring控制器的请求,以获得一些请求者信息或抛出异常,比如安全过滤器

我想知道在Spring中是否有一些内置的东西,比如控制器的过滤器(我不需要为所有的控制器使用它,只需要为某个人使用它)。 我不希望通过url请求应用此筛选器,而是使用类/方法扩展或注释

这是我的实际解决方案:

@Controller
public class MyFilteredController extends FilterController {

    @RequestMapping("/filtered")
    public void test1(HttpServletRequest req){
        InfoBean infobean=filter(req);
        //... controller job
    }

}
使用筛选器方法扩展类的控制器

public abstract FilterController{
    protected InfoBean filter(HttpServletRequest req){
        //... filter job
        return infobean;
    }
}

使用SpringDispatcherServlet的一切都是基于URL的,我认为您不能通过控制器来完成

您需要使用一个过滤器,看看这里的API,您可能需要使用OncePerRequestFilter

public class MyFilter extends OncePerRequestFilter{

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        // TODO Auto-generated method stub

    }

}
然后需要在web.xml中添加过滤器

    <filter>
        <filter-name>requestFilter</filter-name>
        <filter-class>com.greg.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>errorHandlerFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
如果您想向这个类中注入一些Springbean

<bean id="paymentService" class="net.isban.example.service.PaymentService" />

    <bean class="net.isban.example.util.Bridge">
        <property name="paymentService" ref="paymentService" />
    </bean>
很高兴有人能给我展示一种不那么老套的方法

我不想通过url请求应用此筛选器,但要使用 类/方法扩展或注释

为此,您可以注册
HandlerInterceptor
。例如,您可以将筛选器应用于使用
SomeAnnotation
注释的所有处理程序方法,并使用以下代码:

public class CustomHandlerIntercepter extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;

            SomeAnnotation annotation = handlerMethod.getMethodAnnotation(SomeAnnotation.class);
            if (annotation != null) {
                // do stuff
            }
        }
        return true;
    }
}
此外,您应该在
WebConfig
中注册拦截器:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomHandlerIntercepter());
    }
}

您可以在中阅读有关拦截器的更多信息。

您可以在此处使用mvc拦截器

见:

如果您想截取特定的url,您可以按照这里的指定进行截取


看看SpringSandwich

它允许您直接将过滤器(实际上是Spring拦截器)设置为控制器注释。与普通servlet过滤器不同,您还可以完全访问Spring上下文


披露:我是这个框架的作者:)

我不能使用这样的过滤器,因为我需要一些spring上下文对象,如@Service、@Repository等。这就是为什么我需要在控制器中使用过滤器的原因。@Tobia请阅读我的答案,我已经专门向您展示了如何通过Bridge类将bean放入过滤器中,哪些是从非spring(筛选器)到spring容器(@Service等)的桥梁?“//do stuff”还意味着链接像@Services这样的spring bean?如果你想访问spring管理的组件和服务,你应该将此拦截器设置为
组件
,并将它们设置为
拦截器。好的,很好!最后一件事,我可以访问handlerMethod参数吗?
handlerMethod.getMethodParameters()
SpringSandwich似乎比其他方法更好。代码更有条理。谢谢。我会试试的。对不起,但是如何在三明治过滤器中访问@RequestParam属性class@HeisenBerg那么req.getParameter(“我的参数”)呢
public class CustomHandlerIntercepter extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;

            SomeAnnotation annotation = handlerMethod.getMethodAnnotation(SomeAnnotation.class);
            if (annotation != null) {
                // do stuff
            }
        }
        return true;
    }
}
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomHandlerIntercepter());
    }
}