简述SpringMvc怎么配置拦截器?
参考回答
在Spring MVC中,拦截器用于在请求处理之前和之后执行特定的操作。配置拦截器需要以下步骤:
- 创建拦截器类:实现
HandlerInterceptor接口,重写preHandle、postHandle和afterCompletion方法。 - 注册拦截器:在Spring配置文件中,使用
InterceptorRegistry来注册拦截器。 - 配置拦截器的拦截路径:在注册拦截器时,可以配置拦截器应用到哪些请求路径。
详细讲解与拓展
1. 创建拦截器类
Spring MVC的拦截器需要实现HandlerInterceptor接口。该接口有三个方法:
– preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在请求处理之前调用,返回true表示继续处理请求,返回false则终止请求处理。
– postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在请求处理之后调用,但在视图渲染之前。可以对模型数据进行修改。
– afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在请求完成之后调用,通常用于资源清理。
示例拦截器:
public class MyInterceptor implements HandlerInterceptor {
// 请求处理之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Request is being processed...");
return true; // 继续执行请求
}
// 请求处理之后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Request has been processed...");
}
// 请求完成之后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Request is completed...");
}
}
2. 注册拦截器
在Spring MVC中,拦截器需要通过WebMvcConfigurer接口来进行配置。通过实现该接口的addInterceptors方法,可以注册自定义的拦截器。
例如,注册MyInterceptor拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/register"); // 排除某些请求
}
}
addPathPatterns方法用于指定拦截的路径模式,excludePathPatterns方法用于排除不需要拦截的路径。上面的配置表示拦截所有请求,除了/login和/register路径。
3. 配置拦截器的拦截路径
- 路径匹配:
addPathPatterns("/path/*")使用Ant风格的路径匹配,例如/**表示所有路径,/admin/*表示匹配/admin/下的所有路径。 - 排除路径:
excludePathPatterns("/login")用于排除特定路径不被拦截。
常见的配置:
– /**:匹配所有请求。
– /admin/**:匹配/admin/路径下的所有请求。
– /user/*:匹配/user/路径下的任意一个请求。
4. 多个拦截器的配置
如果有多个拦截器,可以在addInterceptors方法中注册多个拦截器,Spring MVC会按照注册顺序依次执行。
例如,注册两个拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor1())
.addPathPatterns("/**");
registry.addInterceptor(new MyInterceptor2())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
5. 使用HandlerInterceptorAdapter简化实现
如果只需要使用preHandle和postHandle方法,可以继承HandlerInterceptorAdapter类,而不需要手动实现HandlerInterceptor接口中的所有方法。
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Request is being processed...");
return true; // 继续执行请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Request has been processed...");
}
}
总结
在Spring MVC中,配置拦截器的过程包括创建一个实现了HandlerInterceptor接口的类,并通过WebMvcConfigurer中的addInterceptors方法将其注册到Spring上下文中。可以指定拦截的路径并排除某些路径。拦截器常用于请求预处理、日志记录、权限检查等操作。通过合理配置拦截器,可以增强应用程序的功能和灵活性。