Spring MVC+HibernateDAO Factory项目:页面刷新时更新Cookie方案咨询
问题分析与解决方案
首先得先揪出你遇到的两个核心问题:服务器端共享对象的数据串用(这才是不同用户之间拿到错误套餐信息的关键),以及Cookie未及时更新导致的同浏览器下残留问题,下面分步给你解决:
1. 先解决跨用户数据串用的核心问题
看你的代码,直接修改从全局membershipPackagesMap里取出的MembershipPackage对象价格:
if(selectedPackage.equals("M_DSC_A")){ membershipPackage.setPrice(membershipPackage.getDiscountPrice()); }else{ membershipPackage.setPrice(membershipPackage.getPrice()); }
如果masterDataManager.getMembershipPackages()返回的是全局缓存的单例对象集合,那这个修改会影响所有后续请求——所有用户拿到的都是被修改过的同一个对象实例!
解决办法是创建对象副本再修改属性,不要直接碰全局共享的实例:
// 从全局Map拿原始对象 MembershipPackage originalPackage = membershipPackagesMap.get(selectedPackage); // 复制出一个新的对象副本(用Spring的BeanUtils或者Apache Commons的工具类都可以) MembershipPackage membershipPackage = new MembershipPackage(); BeanUtils.copyProperties(originalPackage, membershipPackage); // 只修改副本的价格,不会影响全局数据 if(selectedPackage.equals("M_DSC_A")){ membershipPackage.setPrice(originalPackage.getDiscountPrice()); }else{ membershipPackage.setPrice(originalPackage.getPrice()); }
2. 修复Cookie更新逻辑,解决同浏览器的套餐残留问题
要让页面每次刷新时Cookie保持最新,核心是在用户通过URL选择新套餐后,主动覆盖旧的Cookie值,确保Cookie和当前选择一致:
在你处理URL参数infoSelectedPackage的代码块末尾,添加更新Cookie的逻辑:
else { selectedPackage = infoSelectedPackage.trim().substring(2); leadSource = infoSelectedPackage.trim().split("_")[0]; if (!IPaymentConstants.LeadSource.X_INFO.getCode().equals(leadSource) && !IPaymentConstants.LeadSource.Y_SOURCE.getCode().equals(leadSource)) { return ViewNames.VIEW_NAME_404; } // 新增:更新Cookie,保存当前选中的套餐 Cookie packageCookie = new Cookie("selectedPackage", selectedPackage); // 设置有效期,比如30天,按需调整 packageCookie.setMaxAge(30 * 24 * 60 * 60); // 设置Cookie作用域为应用根路径,避免不同路径下的Cookie干扰 packageCookie.setPath("/"); // 如果是HTTPS环境,建议开启Secure;不需要前端JS读取的话,开启HttpOnly更安全 packageCookie.setSecure(true); packageCookie.setHttpOnly(true); // 把Cookie发送给客户端 response.addCookie(packageCookie); }
同时确保你的getSelectedPackageFromCookie方法能正确读取指定Cookie:
private String getSelectedPackageFromCookie(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("selectedPackage".equals(cookie.getName())) { return cookie.getValue(); } } } return null; }
3. 额外优化:用Session替代Cookie做用户会话隔离
如果你的场景是用户需要登录,或者要严格隔离不同用户的套餐选择(比如公共电脑多用户使用的情况),建议用HttpSession替代Cookie存储套餐信息——Session是基于用户会话的,不会跨用户串用:
// 存储套餐到Session request.getSession().setAttribute("selectedPackage", selectedPackage); // 从Session读取套餐 String selectedPackage = (String) request.getSession().getAttribute("selectedPackage");
内容的提问来源于stack exchange,提问作者TinTin
相关产品推荐
相关产品推荐

