用类配置的登录拦截器+用ThreadLocal存储session上的登录用户

拦截器配置类

/**
 * 加入拦截器的配置 :用于拦截用户的请求,判断是否已经登录
 * 如果已经登录(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" ;
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值