拦截器配置类
/**
* 加入拦截器的配置 :用于拦截用户的请求,判断是否已经登录
* 如果已经登录(session有值)进行请求的放行
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
// 登录拦截器的创建
// 本注解用于创建Spring MVC的拦截器对象
@Bean
public LoginInterceptor getLoginInteceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 对登录拦截器的创建
InterceptorRegistration login = registry.addInterceptor(getLoginInteceptor());
// 加入对应的匹配路径 同时将不拦截的路径进行放行
login.addPathPatterns(new String[]{"/*","/*/*" , "/*/*/*"});
// 配置排除的路径
login.excludePathPatterns("/login" ,"/login.action","/register","/register.action", "/css/**", "/js/**", "/fonts/**","/images/**");
}
}
登录拦截器类
/**
* 登录拦截器 输入一个网址,如果你登录过了(有session)就放行;如果你没登陆过,就被拦截到login
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
//private Logger logger = Logger.getLogger(LoginInterceptor.class);
//请求之前
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
/** 拦截到用户的请求了 */
String requestUrl = request.getRequestURL().toString();
/** */
System.out.println("requestUrl:"+requestUrl);
/** 判断session是否存在用户,如果存在说明用户已经登录了,应该放行 */
User user = (User) request.getSession().getAttribute("user");
if(user!=null){
System.out.println("requestUrl:"+requestUrl+"->被放行!");
/** 当前请求:每个请求是否都是一个线程 */
UserHolder.addCurrentUser(user);
return true;
}else{
// 重定向 到登录页面
response.sendRedirect(request.getContextPath()+"/login");
System.out.println("requestUrl:"+requestUrl+"->被拦截!");
return false;
}
}
//请求之后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
UserHolder.removeCurrentUser(); //请求完之后就要释放资源
}
}
用ThreadLocal存储session上的登录用户的类
这样在方法想获取已登录的当前用户的信息的时候就不用传HttpSession 的参数了,直接获取这个静态类的get方法 如:UserHolder.getCurrentUser
public class UserHolder {
/** 定义一个ThreadLocal 存储当前某个请求线程对应的登陆用户 */
private static ThreadLocal<User> users = new ThreadLocal<>();
public static void addCurrentUser(User user){/** 把登录成功的用户存入到UserHolder*/
if(users.get()== null){
users.set(user);
}
}
public static User getCurrentUser(){
return users.get();
}
public static void removeCurrentUser() {
users.remove();
}
}
登录控制类
注意!!!
一定不能把 “login.action" 这个路径拦截了
不然你登录的时候,还没有setSession,就已经被拦截器拦截了,那时你session是没有值的,所以就自然不让你登录
@RequestMapping(value = "login.action", method = RequestMethod.POST)
public String login(@RequestParam("username")String username,
@RequestParam("password")String password ,
HttpSession session,
Model model){
if(loginService.login(username,password)!=null){
User user=loginService.login(username,password);
model.addAttribute("user",user);
session.setAttribute("user",user);
System.out.println(session.getAttribute("user"));
if(user.getStudentOrTeacher()==1){
List<User> studentList =loginService.findAllStudent();
model.addAttribute("studentList",studentList);
return "teacher";
}
if(user.getStudentOrTeacher()==0){
return "haha1";
}
}
model.addAttribute("username",username);
model.addAttribute("password",password);
model.addAttribute("msg","账号或密码错误");
return "login1" ;
}