在没有登录之前,访问其他页面都会被拦截,然后跳转到登录页面。
一. 创建Interceptor配置类
package com.stu.springboot.config;
import com.stu.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//指定拦截的请求
String[] path = new String[]{"/**"}; //拦截所有请求
//指定不拦截的请求
String[] excludePath = new String[]{"/", "/user/loginPage", "/user/registerPage", "/user/login", "/user/register"};
registry.addInterceptor(loginInterceptor()) //添加拦截器
.addPathPatterns(path) //添加拦截请求
.excludePathPatterns(excludePath); //添加不拦截的请求
}
}
二. 编写拦截器类
package com.stu.springboot.interceptor;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.stu.springboot.pojo.User;
import com.stu.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User loginUser = (User) session.getAttribute("loginUser");
if(loginUser != null){
return true;
}
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
//遍历cookie,如果找到登录状态则返回true 继续执行原来的请求
if("username".equals(cookie.getName())){
String username = cookie.getValue();
//是否存在对应的user对象
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername, username);
User user = userService.getOne(queryWrapper);
//存在表示cookie,则不拦截 否则拦截
if(user != null){
session.setAttribute("loginUser", user);
}
return true;
}
}
}
response.sendRedirect(request.getContextPath() + "/user/loginPage");
return false;
}
}