访问网站的时候,不经过login直接访问后续网页时不被允许的,可以先将登录信息放入session中,当访问后续页面的时候,看看session中是否有值就可以了,但是当页面多了,每个页面都得判断这就太麻烦了。用拦截器就方便多了。
1.先编写一个拦截器类实现HanderInterceptor接口
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//打印日志:
String requestURI=request.getRequestURI();
log.info("preHandle拦截的请求路径是{}",requestURI);
//检测登录逻辑
HttpSession session=request.getSession();
Object loginUser=session.getAttribute("LoginUser");//LoginUser这个名是之前登录时放进session的
if (loginUser!=null){
//放行
return true;
}
//拦截住,未登录-》跳转到登录页
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/").forward(request,response);//转发到login页面
return false;
}
/**
* 目标方法执行之后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* ye
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
重写上述三个方法,preHandle方法中获取session,如果为空则拦截,转发到login页面,并提示“请登录”,不为空则放行。那么在之前判断main中是否有session的地方直接这样写就行。后面的页面统一这样判断就可以了。
/**
* 真正是去main页面
* @return
*/
@GetMapping("/main.html")
public String mainPage(HttpSession session,Model model){
//是否登录 拦截器 登录器
log.info("当前方法时{}","mainPage");
return "main";
//进入main中得进行判断是否登录,用放进去得session进行判断空则登录非空则没登陆
//要不然在输上main.html得页面路径就可进入main中
// Object loginUser=session.getAttribute("LoginUser");
// if(loginUser!=null){
// return "main";
// }else{
// model.addAttribute("msg","请重新登录");
// return "login";
// }
}
2.拦截器注册到容器中,实现WebMvcConfigurer的addInterceptors接口
3.指定拦截规则【如果拦截所有,静态资源也会被拦截】
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())//使用那个拦截器
.addPathPatterns("/**")//所有请求都被拦截包括静态资源了。
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//设置要放行的页面。
}
}
WebMvcConfigurer实现定制了web功能的类,在类中重写了addInterceptors方法并将之前写的拦截器放入,并用这两个制定拦截规则addPathPatterns("/**")//所有请求都被拦截包括静态资源了。 .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//设置要放行的页面。
拦截所有并将静态资源放行(页面所需的css,js,image等)。
通过打印日志运行过程时过程
先preHandle,再目标方法mainPage,再postHandle,后afterCompletion