Ale*_*lex 10 spring spring-mvc
@SessionAttributes和HttpSession有什么区别?这两个中的哪一个在会话中保留更长时间的对象?在哪些情况下,我必须使用一个,在另一个情况下?
谢谢
Mas*_*ave 15
@SessionAttributes允许在请求之间保持模型属性会话,并且每个hanlder都是特定的.目的是提供一个结构,该结构将朝着实现会话范围迈出一步(比会话更短,比请求更长).本博客中解释了对会话范围的需求以及@SessionAttributes无法完全提供的原因.
它可以自动存储匹配的模型属性(匹配基于名称).默认存储是HttpSession,但也可以以不同方式配置.文档说
使用此注释指示的会话属性对应于特定处理程序的模型属性,透明地存储在会话会话中.一旦处理程序指示其会话会话完成,将删除这些属性.
然而,这一位在处理程序指示其会话会话完成后将删除这些属性.不会自动发生,并且由开发人员通过在SessionStatus实例上使用setComplete来指示从对话中退出.否则,models属性将保持在会话中,通常是不希望的副作用.
理解差异的最简单方法是观察模型变量的范围和值,使用@SessionAttribute支持的模型变量和"普通"HttpSession变量.
看看这两个简单的控制器
@Controller
@SessionAttributes("modelAndSession")
@RequestMapping("/sessionattr")
public class FirstController {
protected static final String NEXT_VIEW = "next";
@RequestMapping("/init")
public String handlingMethod1( Model model, HttpSession session) {
model.addAttribute(NEXT_VIEW, "/sessionattr/afterinit");
session.setAttribute("session", "TRUE");
model.addAttribute("modelAndSession", "TRUE");
model.addAttribute("model", "TRUE");
return "index";
}
@RequestMapping("/afterinit")
public String handlingMethod2(SessionStatus status, Model model) {
model.addAttribute(NEXT_VIEW, "/nosessionattr/init");
//status.setComplete();
return "index";
}
}
Run Code Online (Sandbox Code Playgroud)
第二个控制器
@Controller
@RequestMapping("/nosessionattr")
public class SecondController {
protected static final String NEXT_VIEW = "next";
@RequestMapping("/init")
public String handlingMethod3(Model model) {
model.addAttribute(NEXT_VIEW, "/sessionattr/init");
return "index";
}
}
Run Code Online (Sandbox Code Playgroud)
以及将触发流程的视图
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<a href="${next}">Next step ${next}</a>
<hr/>
<table>
<thead>
<th>key</th> <th>Request scope</th> <th>Session scope</th>
</thead>
<tr>
<td>model</td> <td>${requestScope.model}</td> <td>${sessionScope.model}</td>
</tr>
<tr>
<td>model and session</td> <td>${requestScope.modelAndSession}</td> <td>${sessionScope.modelAndSession}</td>
</tr>
<tr>
<td>session</td> <td>${requestScope.session}</td> <td>${sessionScope.session}</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
在初始请求时/sessionattr/init,视图呈现如下

因此模型变量在请求范围中可用,sessionattribute在请求和会话范围中都可用,并且"normal"会话属性仅在会话范围内可用
在下一个请求中/sessionattr/afterinit,视图呈现如下

因此,仅模型变量消失了,而@SessionAttribute模型属性从会话推送到模型并在请求之间保持不变.下一步将以第二个控制器为目标/nosessionattr/init,视图将呈现如下

现在@SessionAttribute模型对象已从模型中消失,但由于status.setComplete未被明确调用,因此它作为正常变量保留在会话中
这是一个特别令人困惑的场景,因为许多人希望@SessionAttribute模型对象在切换处理程序后应该消失,但是除非明确清除,否则它仍然在会话中.随意复制片段并进一步调查混淆您的组合
| 归档时间: |
|
| 查看次数: |
5111 次 |
| 最近记录: |