1. 背景
最近在开发对接智谱AI超拟人大模型,放了方便在pom.xml
中引入了热部署相关的依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
登录校验基于Session
,把登录的用户信息保存到Session
对象中。
@PostMapping("/login")
public BaseResponse login(HttpServletRequest request, @RequestBody User user) {if (user != null && StringUtils.isNotBlank(user.getName()) && StringUtils.isNotBlank(user.getPassword())) {String name = user.getName();String password = user.getPassword();User tempUser = userService.login(name, SecureUtil.md5(password));if (tempUser != null) {Map<String, String> map = new HashMap<>();map.put("id", String.valueOf(tempUser.getId()));map.put("name", tempUser.getName());map.put("email", tempUser.getEmail());map.put("phone", tempUser.getPhone());// 保存用户的登录状态HttpSession session = request.getSession(true);session.setAttribute("user", tempUser);return BaseResponse.success(map);} else {return BaseResponse.error(ErrorCode.USERNAME_PASSWORD_ERROR);}}return BaseResponse.error(ErrorCode.MISS_PARAMS);
}
然后在拦截器中判断能否从这个Session
对象中获取对用户信息,如果可以就放行,否则拦截。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession(true);Object user = session.getAttribute("user");if (user != null) {return true;}request.getRequestDispatcher("/error/login").forward(request, response);return false;
}
2. 问题
首先我们第一次启动项目后,登录进入系统,然后重启项目,不用重新请求登录接口,直接就可以访问其它接口。
也就是这个Session
在项目重启之后还存在,即Session
持久化到硬盘中了,才会导致每次重启项目之后这个Session
还存在的问题。
3. 解决问题
3.1 解决方式一
修改application.yml
配置文件
server:servlet:session:persistent: false
注入persistent
的值为false
,也就是不持久化。
注意:其实内部默认值就是false
,是引入的依赖中修改了这个值,所以导致内部值自动变为true
,从而导致的重启项目之后还会存在上次登录的Session
信息。
3.2 解决方式二
注意:去掉依赖之后一定要记得点击右侧的刷新按钮,不要没点击刷新就直接点击clean
,这样是没有效果的,项目内部还是会存在这两个依赖。
更多内容欢迎访问博客