- 在demo05的基础上开发
- 认证时勾选记住我,认证成功后,会在应用程序中生成remember-me和JSESSIONID
- 数据库中会生成1条记录
- 为了演示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
- 重新打开浏览器,或者删除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 : "/";
}
}
- 再次认证
- 超过1分钟后,提示超时,并自动删除cookie