Spring给我们开放了拦截器的接口(HandlerInterceptor) 我们只要去写实现类就OK了
加入我们登录成功后会设置一个叫user的session
拦截器就要根据这个session判断用户是否登录了
代码:
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private HttpSession httpSession;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/**
* HandlerMethod=>Controller中标注@RequestMapping的方法
* 需要配置静态资源不拦截时,添加这块逻辑 => 前后端分离项目
*/
if (!(handler instanceof HandlerMethod)) {//放行controller接口外的,如静态资源
return true;
//这里如果发现没有这个路径就会return true,但不会结束程序而是再次进入if判断,此时的url是一个/error的路径,这个路径不符合if的条件然后执行下面的代码
}
if (httpSession.getAttribute("user") == null) {
// 未登录跳转到登录界面
response.sendRedirect("/login");//路径自己写,这是我的路径
return false;
} else {
return true;
}
}
//Controller逻辑执行完毕但是视图解析器还未进行解析之前
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
//Controller逻辑和视图解析器执行完毕
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
然后我们要将自己写的拦截器注册一下
相同道理我们手动实现 接口(WebMvcConfigurer)
代码:
@Configuration//表明这是配置类,并交给Spring管理
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**")//设置拦截路径
.excludePathPatterns("/login/**");// 那些路径不拦截(如果登录路径都拦截了用户还干什么啊)
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
这里有一个小点(选看):
注册类为什么要有这段代码?
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
难道不能直接在上面new码,类似这样的:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
// 那些路径不拦截
.excludePathPatterns("/login/**");
}
大家可以尝试一下,按我的这种写法是不行的,因为我的拦截器类的session上有注解@Autowired
让spring来依赖注入,但是我们的拦截器类上并没有任何注解,也就是说没有交给Spring管理,所以设置拦截路径的时候如果直接new会报错空指针,显示没有session
因为如此才有了下面的代码:
@Bean//放进spring的IOC容器中管理
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}