问题发现:
当用户未登陆时,访问个人中心主页等界面时,请求应该被拦截,并转发到登录界面,之前在 培训教育系统项目中也做过这块功能,现在通过springboot开发这个项目时,拦截器配置不在配置文件中配置了,虽然做过,但多少实现步骤发生了一些变化,所以也遇到了一些问题。现在虽然这块功能实现了,但是通过其他办法解决的,还有一个疑惑还未解决。
具体项目:
这是工程目录:
配置一个拦截器组件,这里我只重写了预处理方法:
@Component
public class loginInterceptor implements HandlerInterceptor {
//预处理回调方法,实现处理器的预处理
//返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
//如果用户已登录也放行
if(session.getAttribute("user")!=null){
return true;
}
request.setAttribute("noLogin","noLogin");
//用户没有登录跳转到登录页面
request.getRequestDispatcher("/login.html").forward(request, response);
return false;
}
}
新建配置类来管理拦截器:
@Configuration
public class myWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private loginInterceptor login;
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("拦截===========");
registry.addInterceptor(login)
.addPathPatterns("/**")
.excludePathPatterns("/manager/login","/login.html","/user/**","/img/**");
}
}
然后就出现问题,按说是当没有登录时,访问个人主页,会被拦截,然后进入到loginInterceptor,通过转发到login.html页面,配置中login.html页面是放行的,但是现实是,login.html页面没有被放行,也被拦截,最后页面报错。
问题解决:
拦截器组件中没有登录时,转发路径不是直接去login.html,而是通过controller方法去跳转到登录页面。
关键:
问题是解决了,可以拦截跳转了,但是还是不明白为什么上面直接转发到login.html会出错,配置拦截器里面明明放行了!!!请大神指教一下…