我正在尝试将一些数据存储在会话属性中,但是在尝试更新它之后我遇到了一些奇怪的问题。我正在使用Spring boot 1.2.4
我创建了一个测试控制器来描述这个问题。
@RestController
@SessionAttributes(TestController.ATTRIBUTE)
public class TestController {
public static final String ATTRIBUTE = "attribute";
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/set/{value}", method = RequestMethod.POST)
public void set(@PathVariable Long value, HttpSession session) {
System.out.println("Set value to: " + value + " session id:\t" + session.getId());
session.setAttribute(ATTRIBUTE, value);
}
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/get", method = RequestMethod.GET)
public void get(HttpSession session) {
System.out.println("Value: " + session.getAttribute(ATTRIBUTE) + " session id:\t\t" + session.getId());
}
}
例如,如果我这样调用这些方法:
localhost:8080/set/1
localhost:8080/set/2
localhost:8080/get
我希望获得看起来像这样的输出(会话ID除外):
Set value to: 1
Set value to: 2
Value: 2
然而,我得到的是(包括会话ID):
Set value to: 1 session id: 9D6F9948E81654E4087F418EF6BF5157
Set value to: 2 session id: 9D6F9948E81654E4087F418EF6BF5157
Value: 1 session id: 9D6F9948E81654E4087F418EF6BF5157
答案 0 :(得分:0)
我的同事提出了一种似乎非常有效的不同方法。
我已经创建了一个类来保存我需要的数据。
std::map<std::pair<int, int>, element>
在我的控制器中,我只是@Autowire对象。
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class DataHolder {
private Long data;
public DataHolder() {
data = 0L;
}
public Long getData() {
return data;
}
public void setData(Long data) {
this.data = data;
}
}
通过这样做,我也可以在其他控制器之间共享这些数据,唯一需要做的就是每个控制器中需要这些值的对象上的@Autowire注释。