在这儿说一下我的实现步骤
首先创建自己的HandlerInterceptor类,继承HandlerInterceptor,并实现内部的三个方法
注意:内部使用了@Configuration注解,从Spring3.0开始,@Configuration用于定义配置类,可替换xml配置文件,首先请确保你的spring大于3.0哦。
package com.example.demo.controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
/*该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller,
当返回值为true 时就会继续调用下一个Interceptor的preHandle 方法,
如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法;*/
//-----------------------------------------------------------------------------
//----------------可以在此处进行编写你的拦截逻辑,下面来个例子------------------------
//打印此次请求的SessionId
System.out.println(request.getSession().getId());
//判断此次的请求是否为域请求,如果是则不拦截
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
return true;
}
//获取请求的头部中键为token的部分
String token = request.getHeader("token");
//我这里使用了Redis服务,存储对象,这里可以实现你自己的逻辑哦
if (null == mRedisUtil.get(token)) {
//此处使用打印的方式实现返回,而不是使用抛出异常的方式来进行
response.setHeader("content-type", "application/json;charset=UTF-8");
response.getWriter().println("请先登录哦!");
return false;
}
//--------------------------以上是例子哦,不用贴过去的-----------------------------
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
/*该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,
该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。
用于进行资源清理。*/
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
/*该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,
可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。*/
}
}
我们主要使用的是preHandle方法来进行拦截操作,然后在内部实现具体拦截逻辑。
然后需要给我的拦截器配置ConfigurerAdapter
接下来新建一个我们自己的ConfigurerAdapter继承WebMvcConfigurerAdapter
package com.example.demo.controller;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Bean
public MyHandlerInterceptor pagePopulationInterceptor() {
//在此处使用我们自己的HandlerInterceptor
return new MyHandlerInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(pagePopulationInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
//这里可以重写这个方法来解决域请求的问题哦,如果不需要可以删除的
registry.addMapping("/**");
}
}
到此,我们就可以实现Springboot的请求拦截啦~有帮助的话麻烦动动小指点个赞哦