下面是SpringMVC自定义拦截器实现的详细攻略。
什么是拦截器?
拦截器(Interceptor)是SpringMVC框架提供的用于处理请求的一种机制。拦截器在处理请求的过程中,可以在Controller之前或之后执行一些共同的操作,如记录日志、检查用户权限、对请求参数进行统一预处理等等。拦截器类似于Servlet的过滤器(Filter),不同的是拦截器可以选择性地进行拦截。
实现过程
第一步:创建拦截器类
拦截器是一个类,需要实现HandlerInterceptor接口,并实现其中的三个方法:
- preHandle:在请求处理之前执行,返回值为布尔类型。如果返回true,则继续执行请求;如果返回false,则停止执行请求,直接返回响应。
- postHandle:在请求处理之后执行,但未返回响应之前。可以进行一些request,response的后处理操作。
- afterCompletion:在请求处理之后执行,包括返回响应之后。一般用于资源清理等操作。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 处理逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 处理逻辑
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 处理逻辑
}
}
第二步:配置拦截器
- 创建配置类
创建一个配置类,用于配置拦截器。
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加拦截器
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
上面的代码中,我们新建一个类InterceptorConfig,并实现了WebMvcConfigurer接口,重写了addInterceptors方法。在这个方法中,我们可以添加自己的拦截器。
- 配置拦截器类
将拦截器和配置类联系起来,我们需要在Web应用程序的配置文件(一般是JavaConfig 或 XML)中注册我们的拦截器配置类。比如,在SpringBoot工程中,我们可以新建一个类InterceptorConfig,加上@Configuration注解,代码如下:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
}
}
上面的代码中,我们新建了一个名为“myInterceptor”的拦截器类。在addInterceptors方法中,我们添加了myInterceptor并设置了拦截的路径为“/**”。
第三步:测试拦截器
测试拦截器的效果,我们可以创建一个简单的Controller,用于测试。代码如下:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "Hello,MVC";
}
}
我们可以使用Postman或者浏览器访问http://localhost:8080/hello,预期拦截器的功能能够正确地进行拦截处理。
示例一:拦截未登录用户访问
在上面这个例子中,我们新建一个MyInterceptor拦截器用于处理请求。下面我们来看一个更实际的例子吧,在我们平常的网站系统中,需要对未登录的用户进行拦截,如果未登录则跳转到登录页面进行登录后再进行访问。
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
Object object = session.getAttribute("user");
if (object == null) {
response.sendRedirect("/login/loginPage");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
上述代码中,我们定义了一个LoginInterceptor拦截器,用于拦截未登录的请求。在preHandle方法中,我们通过HttpSession来获取用户的登录状态。如果用户没有登录,则重定向到登录页面,否则继续执行请求。另外两个方法不做处理,保持默认即可。
我们将LoginInterceptor添加到配置文件中,配置类代码如下:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public LoginInterceptor loginInterceptor() {
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login/loginPage", "/login");
}
}
上述代码中,我们将LoginInterceptor添加到配置文件中,配置了拦截器的路径为“/**”,即所有请求都需要进行拦截。但我们需要排除登录的请求(即“/login/loginPage”和“/login”),不进行拦截处理。
示例二:拦截非法字符
我们再来看一个示例,在我们的网站系统中,给用户提供评论的功能,但是我们不允许用户输入敏感字符,这时候我们可以用拦截器对用户输入的评论进行过滤。
public class CommentInterceptor implements HandlerInterceptor {
private static final String REGEX = ".*渣.*|.*垃圾.*|.*差评.*|.*欠揍.*|.*好评.*|.*五星.*";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String comment = request.getParameter("comment");
if (StringUtils.isNotBlank(comment) && comment.matches(REGEX)) {
throw new RuntimeException("包含非法字符,请勿输入敏感字眼!");
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
上述代码中,我们定义了一个CommentInterceptor拦截器,用于拦截用户评论中是否包含敏感字符。在preHandle方法中,我们获取用户评论的内容,并进行正则匹配。如果匹配到了敏感字符,我们抛出一个异常。
我们将CommentInterceptor添加到配置文件中,配置类代码如下:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public CommentInterceptor commentInterceptor() {
return new CommentInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(commentInterceptor()).addPathPatterns("/comment");
}
}
上述代码中,我们将CommentInterceptor添加到配置文件中,配置了拦截器的路径为“/comment”,即评论请求需要进行拦截。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC自定义拦截器实现过程详解 - Python技术站