配置session会话超时时长,自定义session失效处理

时间:2022-10-01 08:56:21
  • 在demo05的基础上开发
  • 认证时勾选记住我,认证成功后,会在应用程序中生成remember-me和JSESSIONID
  • 配置session会话超时时长,自定义session失效处理

  • 数据库中会生成1条记录
  • 配置session会话超时时长,自定义session失效处理

  • 为了演示session的作用,所以在之后的测试中不勾选记住我
  • ​在web模块的yml中设置session会话超时时长​
server:
servlet:
session:
timeout: 1m # session会话超时时间,默认情况 下是30分钟(m),不能小于1分钟
  • 设置为1分钟后,访问success接口,该接口需要认证,认证成功后,会跳转到success.html
  • 无操作1分钟后,刷新页面,这时又跳转到认证页面,这是因为会话超时了
  • ​session会话超时后的处理​
  • 编写会话超时的处理类,需实现InvalidSessionStrategy接口
import com.ychen.security.result.MengxueguResult;
import org.springframework.http.HttpStatus;
import org.springframework.security.web.session.InvalidSessionStrategy;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CustomInvalidSessionStrategy implements InvalidSessionStrategy {

// session会话超时时,返回json字符串
@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 返回的结果集
MengxueguResult result = new MengxueguResult().build(HttpStatus.UNAUTHORIZED.value(), "登录已超时,请重新登录");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(result.toJsonString());
}

}
  • 配置到容器中
import com.ychen.security.authentication.CustomInvalidSessionStrategy;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.web.session.InvalidSessionStrategy;

/**
* 主要为容器中添加Bean实例
*/
@Configuration
public class SecurityConfigBean {

// 如果容器中还有InvalidSessionStrategy的实现类,则使用新的实现类
// 如果没有,则使用CustomInvalidSessionStrategy来处理session会话超时
@Bean
@ConditionalOnMissingBean(InvalidSessionStrategy.class)
public InvalidSessionStrategy invalidSessionStrategy() {
return new CustomInvalidSessionStrategy();
}

}
  • 配置到security配置类中
# 注入
@Autowired
private InvalidSessionStrategy invalidSessionStrategy;

# 配置
.and()
.sessionManagement() // session管理
.invalidSessionStrategy(invalidSessionStrategy)
  • 这是不管访问哪个接口,发现都提示访问超时
  • 因为浏览器中保存了JSESSIONID
  • 配置session会话超时时长,自定义session失效处理

  • 重新打开浏览器,或者删除JSESSIONID,才能再次认证
  • 修改会话超时的处理类
public class CustomInvalidSessionStrategy implements InvalidSessionStrategy {

// session会话超时时,返回json字符串
@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 要将浏览器中的cookie的jsessionid删除
cancelCookie(request, response);
// 返回的结果集
MengxueguResult result = new MengxueguResult().build(HttpStatus.UNAUTHORIZED.value(), "登录已超时,请重新登录");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(result.toJsonString());
}

// 删除cookie的方法
protected void cancelCookie(HttpServletRequest request, HttpServletResponse response) {
Cookie cookie = new Cookie("JSESSIONID", null);
cookie.setMaxAge(0);
cookie.setPath(getCookiePath(request));
response.addCookie(cookie);
}

// 获取cookie路径的方法
private String getCookiePath(HttpServletRequest request) {
String contextPath = request.getContextPath();
return contextPath.length() > 0 ? contextPath : "/";
}

}
  • 再次认证
  • 配置session会话超时时长,自定义session失效处理

  • 超过1分钟后,提示超时,并自动删除cookie
  • 配置session会话超时时长,自定义session失效处理