使用Java Servlet实现服务端存储替代客户端Session Storage咨询
Java Servlet 实现服务端存储替代 Session Storage 落地方案
1. 核心选型说明
Servlet 规范自带的 HttpSession 本身就是服务端会话存储能力,完全匹配原有 Session Storage 的会话级存储生命周期(浏览器关闭自动失效),无需额外引入基础组件,可直接复用容器(Tomcat、Jetty 等)的会话管理能力,容器会自动生成 JSESSIONID Cookie 关联客户端和服务端会话。
2. 服务端接口实现
直接编写统一的存储操作 Servlet 即可,支持存、取、删三类基础操作:
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/server-storage") public class ServerStorageServlet extends HttpServlet { // 存储数据:对应原 sessionStorage.setItem @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("application/json;charset=utf-8"); String key = request.getParameter("key"); String value = request.getParameter("value"); request.getSession().setAttribute(key, value); response.getWriter().write("{\"code\":200,\"msg\":\"存储成功\"}"); } // 查询数据:对应原 sessionStorage.getItem @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("application/json;charset=utf-8"); String key = request.getParameter("key"); Object value = request.getSession().getAttribute(key); String res = String.format("{\"code\":200,\"data\":\"%s\"}", value == null ? "" : value); response.getWriter().write(res); } // 删除数据:对应原 sessionStorage.removeItem @Override protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("application/json;charset=utf-8"); String key = request.getParameter("key"); request.getSession().removeAttribute(key); response.getWriter().write("{\"code\":200,\"msg\":\"删除成功\"}"); } }
3. 客户端适配改造
把原有的 Session Storage 操作替换为接口调用即可,可封装统一工具函数对齐原有调用逻辑:
// 存储数据 async function setServerStorage(key, value) { await fetch('/server-storage', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `key=${encodeURIComponent(key)}&value=${encodeURIComponent(value)}` }) } // 读取数据 async function getServerStorage(key) { const res = await fetch(`/server-storage?key=${encodeURIComponent(key)}`) const result = await res.json() return result.data } // 删除数据 async function removeServerStorage(key) { await fetch(`/server-storage?key=${encodeURIComponent(key)}`, {method: 'DELETE'}) }
4. 生产环境优化配置
- 会话有效期调整:在项目
web.xml中添加配置,对齐原有业务的会话过期规则:
<session-config> <!-- 单位为分钟,默认30分钟,设置为-1表示永不超时(不推荐) --> <session-timeout>30</session-timeout> <cookie-config> <!-- 开启HttpOnly防止XSS窃取会话ID --> <http-only>true</http-only> <!-- HTTPS环境下开启防止会话劫持 --> <secure>true</secure> </cookie-config> </session-config>
- 多实例部署适配:如果需要集群部署会话共享,直接集成 Spring Session 或容器自带的 Redis 会话同步方案即可,无需修改业务代码。
- 权限校验:接口层统一添加登录态校验逻辑,避免未授权用户读写他人存储数据。
内容的提问来源于stack exchange,提问作者codingninza
相关产品推荐
相关产品推荐

