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