springboot的拦截器的注册还是比较方便的主要还是分为两部分:
1、实现HandlerInterceptor接口创建拦截器
2、实现WebMvcConfigurer接口配置拦截器
一下使用一个简单的例子还是说明其用法,就拿登录后才可以访问某一些页面来讲
1、创建拦截器,实现HandlerInterceptor接口
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//在这个方法中实现逻辑
//判断是否登录,在session中获取user
User user = (User) request.getSession().getAttribute("User");
if(user == null){
//没登录就跳到登录页面
response.sendRedirect(request.getContextPath()+"/user/error");
// response.sendRedirect(request.getContextPath()+"/templates/login.html");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(11111);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(22222);
}
}
2、配置拦截器
@Configuration //定义此类为配置类
public class UserConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//需要拦截的路径
//拦截user下所有的路径,必须登录在可以访问
String [] addPathPatterns ={
"/user/**"
};
//需要放行的路径
//不需要登录的,也可以访问
String [] excludePathPatterns ={
"/user/out","/user/error","/user/login"
};
registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
}
}
就是在上面,我们可以不需要登录就可以访问,/user/out, /user/error,/user/login,只要当登录之后才可以访问/user/center,不然就被拦截,访问/user/error了
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/login")
public @ResponseBody Object login(HttpServletRequest request){
User user = new User();
user.setName("zhangsan");
user.setSex("男");
user.setPassword(123456);
request.getSession().setAttribute("User",user);
return "success";
}
@RequestMapping("/center")
public @ResponseBody Object center(){
return "center";
}
@RequestMapping("/out")
public @ResponseBody Object Out(){
return "out";
}
@RequestMapping("/error")
public @ResponseBody Object Error(){
return "error";
}
}
注意点:
拦截器中方法的执行顺序是 preHandle -> Controller -> postHandle -> afterCompletion
只有preHandle返回true,才会执行后面的方法