我有一个非常简单的webapp跟随tutorials set out by Mkyong和其他人。
我希望我的webapp的范围被浏览器会话击败。这是一个不同的用户,或者不同的浏览器选项卡不应与其他用户/浏览器选项卡共享对象。
在这里,我们对教程中设置的代码进行了最小的更改:
package com.mkyong.common.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/welcome")
public class HelloController {
private int i = 0;
@RequestMapping(method = RequestMethod.GET)
public String printWelcome(ModelMap model, HttpServletRequest r) {
System.out.println(r.getSession().getId());
System.out.println(i++);
model.addAttribute("message", "Spring 3 MVC Hello World");
return "hello";
}
}
输出:
F6E793D5ED12880E2F909A1A0C1D2D98
0
3E53022170EB77C0208AC0221A68D4D8
1
38A432F7C813A775E8F201AFB42178DB
2
这表明存在不同的Http会话,但它们具有相同的共享资源。
我如何区分它们?
答案 0 :(得分:0)
只需将范围注释添加到控制器类:
@Controller
@RequestMapping("/welcome")
@Scope("session")
public class HelloController {
....
答案 1 :(得分:0)
我建议使用模型来代替控制器。这意味着创建一个类,它将封装您的会话数据并提供类会话范围。
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyModel {
// plain object
int i = 0;
}
好处是只有会话数据存储在http会话中,控制器可以是单例(即没有指定范围)。如果您的配置包括http会话复制,这可能是一种更明智的方法。