HttpSession无法保存session属性 校验接口返回会话ID不一致求助
问题解决思路与方案
1 先修复代码中的明显错误
你当前的checkSession方法存在两个低级问题,会直接导致session校验失败:
- 空指针风险:当
session == null时,你还调用了session.getId(),会直接抛出空指针异常,需要先删除这部分逻辑。 - 属性名不匹配:你在登录接口存储的属性名是
username,但校验接口取值时用了user,永远取不到对应值,需要统一属性名。
修正后的checkSession代码如下:
@GET @Path("/checkSession") @Produces(MediaType.APPLICATION_JSON) public Response userLoginCheck(@Context HttpServletRequest rq){ HttpSession session = rq.getSession(false); String msg; if( session == null){ msg = "Session not available"; return Response.ok().entity(msg).build(); }else if(session.getAttribute("username") == null){ msg = "无法获取对应session属性,当前SESSION ID : " + session.getId(); return Response.ok().entity(msg).build(); } else{ // 和存储时的属性名保持一致,使用username return Response.ok().entity(session.getAttribute("username")).build(); } }
2 解决session ID不一致的核心问题
session ID不一致本质是请求没有携带登录时下发的JSESSIONID Cookie,后端识别不到旧会话,就会创建新的会话,常见原因和解决方案如下:
2.1 跨域场景配置问题
如果前端和后端接口的域名、端口、协议任意一项不同,就属于跨域请求,默认浏览器不会携带Cookie,需要前后端同时配置:
- 后端配置CORS允许携带凭证:
不能把Access-Control-Allow-Origin设为*,必须指定前端的完整地址,同时新增Access-Control-Allow-Credentials: true响应头,可直接新增全局CORS过滤器:@Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { // 替换为你实际的前端地址 responseContext.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:8080"); responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true"); responseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } } - 前端请求开启凭证携带:
不同请求工具配置方式不同,示例如下:- axios配置:
// 全局配置 axios.defaults.withCredentials = true; // 单次请求配置 axios.post('/login', userInfo, { withCredentials: true })- fetch配置:
fetch('/checkSession', { credentials: 'include' })
2.2 测试工具配置问题
如果你用Postman、Apifox等工具测试,需要开启「自动保存Cookie」的开关,否则每次请求都是独立的,不会携带上次接口返回的JSESSIONID,自然每次session ID都不同。
2.3 服务端session配置问题
检查项目web.xml的session配置,确认Cookie的path属性设置为/,如果path只设置了/login,那只有登录接口能拿到session,其他路径请求会拿不到旧会话:
<session-config> <cookie-config> <path>/</path> <!-- 如果是同根域名不同子域名,还可以配置domain为你的根域名 --> <!-- <domain>example.com</domain> --> <http-only>true</http-only> </cookie-config> <session-timeout>30</session-timeout> </session-config>
内容的提问来源于stack exchange,提问作者jahir noe
相关产品推荐
相关产品推荐

