现象:之前使用@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>
贴一篇详解:
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>