Spring更新@SessionAttributes值

时间:2015-07-20 17:14:26

标签: java spring-mvc spring-boot

我正在尝试将一些数据存储在会话属性中,但是在尝试更新它之后我遇到了一些奇怪的问题。我正在使用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

1 个答案:

答案 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注释。