过滤器在拦截请求的时候,会根据申请访问资源的sessionid寻找服务器内存储的对应session,再根据session内的相应字段是否为空来决定是否放行。由于一个浏览器与一个服务器之间只有一个session,是共享的,这个时候如果先后判断后台和移动端的用户是否分别登陆,就会出现其中任意一方登陆,另一方都会被放行的bug
4.1判断后台登录状态,如果已登录,则直接放行 /** * 这里有一个bug,就是当后台登录以后,如果我们使用同一个浏览器进行移动端登录,那么会直接在这一步骤放行请求 * 不会再去判断session的user属性是否为空,会导致可以绕过登录,直接访问页面上的任何资源 * 解决方法①与前端约定,所有的后台访问路径加入一个”/api“,这样可以在判断employee和user属性是否为空后, * 再次判断是否是后台或者前台的请求,如果不是则放行 * 解决方法②使用无状态的token代理有状态的session进行身份校验,例如现在非常流行的jwt令牌 */ if (request.getSession().getAttribute("employee") != null){ log.info("商家已登录,id为{}",request.getSession().getAttribute("employee")); BaseContext.setCurrentId((Long) request.getSession().getAttribute("employee")); // long id = Thread.currentThread().getId(); // log.info("当前线程id:{}",id); filterChain.doFilter(request,response);//放行 return; } // 4.2判断移动端登录状态,如果已登录,则直接放行 if (request.getSession().getAttribute("user") != null){ log.info("用户已登录,id为{}",request.getSession().getAttribute("user")); BaseContext.setCurrentId((Long) request.getSession().getAttribute("user")); // long id = Thread.currentThread().getId(); // log.info("当前线程id:{}",id); filterChain.doFilter(request,response);//放行 return; }