用拦截器实现一个登录验证功能
step1:自定义拦截器
import .;
import org.;
import org.;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* 自定义拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
private static final Logger logger = ();
/**
* 在请求匹配controller之前执行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = ();
String methodName = ();
// 判断用户有没有登录,一般登录之后的用户都有一个对应的token
UnInterception unInterception = ();
String token = ("token");
if (null == token || "".equals(token)) {
("用户未登录,没有权限执行{}请登录", methodName);
return false;
}
// 返回true才会执行方法,返回false不会执行
return true;
}
/**
* 已经执行完controller了,但是还没有进入视图渲染
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = ();
String methodName = ();
("已经执行完{}了,但是还没有进入视图渲染", methodName);
}
/**
* 视图也渲染完了,此时我可以做一些清理工作了
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
("视图也渲染完了,此时我可以做一些清理工作了");
}
}
step2:配置拦截器
import .;
import ;
import ;
import ;
import ;
@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
(new MyInterceptor()).addPathPatterns("/**"); // 拦截所有内容:/** 拦截部分内容:/admin/**
(registry);
}
/**
* 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
("/**").addResourceLocations(
"classpath:/static/");
("").addResourceLocations(
"classpath:/META-INF/resources/");
("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
(registry);
}
}
step3:自定义测试controller
@Controller
@RequestMapping("/interceptor")
public class InterceptorController {
@RequestMapping("/test")
public String test() {
return "hello";
}
}
step4:测试
进入浏览器,输入http://localhost:8080/interceptor/test
结果:无法进入,日志:用户未登录,没有权限执行 test 请登录
进入浏览器,输入http://localhost:8080/interceptor/test?token=1
结果:成功进入