最近从头开始用springboot做了一个项目,做到了一个登录拦截,实现很简单,记录一下。
1.注册拦截器,新建类 MVCConfiguration
@Configuration
@EnableCaching
public class MVCConfiguration implements WebMvcConfigurer {
/*
* 配置拦截器
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加对用户是否登录的拦截器,并添加过滤项、排除项
//一开始把用户登录功能也给拦截了,跳转不了
registry.addInterceptor(new UserLoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/static/*")
.excludePathPatterns("/toLogin")
.excludePathPatterns("/user/verifyUser");
WebMvcConfigurer.super.addInterceptors(registry);
}
/*
* 配置静态资源
* */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
//设置默认页面
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/toLogin");
//设置优先级 当请求地址有重复的时候 执行优先级最高的
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
WebMvcConfigurer.super.addViewControllers(registry);
}
}
2.拦截器,实现 UserLoginInterceptor
@Component
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession httpSession=request.getSession();
Object userId=httpSession.getAttribute("userId");
if(null!=userId ){
System.out.println("已登录"+userId);
return true;
}else{
System.out.println("未登录");
response.sendRedirect(request.getContextPath()+"/toLogin");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
三个方法:
1.preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理。
2.postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。
3.afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面)。