记SpringMVC model & session一个使用问题

本文探讨了Spring MVC中@SessionAttributes注解的使用方法及其在实际业务场景中的问题。特别是当尝试更新Session中的值时,发现前端显示的仍是修改前的数据。文章通过示例代码详细解释了这一现象的原因,并提供了理解model和Session交互的关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象:之前使用@SessionAttributes注解以及在handler中使用modelMap添加缓存,业务中有替换缓存属性的需要,结果通过HttpSession修改后前端获取还是修改前的值
贴一篇详解:
http://www.importnew.com/16782.html
Spring model在每次请求方法处理完后会将model中的值复制到request中,以及根据sessionAttributes中添加的参数将同名参数复制到httpSession中,所以在方法中修改的操作又被覆盖。
@Controller
@RequestMapping("/dpip")
@SessionAttributes({"userid"})
public class DpipController {
protected Logger logger = LoggerFactory.getLogger(DpipController.class);
@RequestMapping("/testModel.do")
public String test(HttpServletRequest request, ModelMap model){
Enumeration<String> requEnumeration = request.getAttributeNames();
while (requEnumeration.hasMoreElements()) {
String s = (String) requEnumeration.nextElement();
System.out.println(s);
System.out.println("="+ request.getAttribute(s));
}
System.out.println("session===========");
Enumeration<String> sessionE = request.getSession().getAttributeNames();
while (sessionE.hasMoreElements()) {
String e = (String) sessionE.nextElement();
System.out.println(e);
System.out.println("="+request.getSession().getAttribute(e));

}
Object userid = "xushulin";
model.put("userid", userid);


return "/WechatTemplate/nextModel";

}
@RequestMapping("/changeModel.do")
public String changeSession(HttpServletRequest request){
Object userid = request.getSession().getAttribute("userid");
System.out.println("userid:========"+userid);
request.getSession().setAttribute("userid", "liliang");
Object nextUserid = request.getSession().getAttribute("userid");
System.out.println("nextUserid:"+nextUserid);
return "/WechatTemplate/changedModel";
}

@RequestMapping("/lastModel.do")
public String lastSession(HttpServletRequest request){
Object userid = request.getSession().getAttribute("userid");
System.out.println("userid:========"+userid);
return "/WechatTemplate/lastModel";
}
}


jsp页面(model.jsp/nextModel.jsp/changeModel.jsp/)
<div>
<%  
    java.util.Enumeration<String> reqEnum = request.getAttributeNames();  
    while (reqEnum.hasMoreElements()) {  
        String s = reqEnum.nextElement();  
        out.print(s);  
        out.println("==" + request.getAttribute(s));  
%><br />  
<%  
    }  
%>
model页面


<div>
<%  
    java.util.Enumeration<String> reqEnum = request.getSession().getAttributeNames();  
    while (reqEnum.hasMoreElements()) {  
        String s = reqEnum.nextElement();  
        out.print(s);  
        out.println("==" + request.getAttribute(s));  
%><br />  
<%  
    }  
%>
model页面
<a href="<%=request.getContextPath()%>/dpip/testModel.do">next</a>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值