如何在Spring MVC中的http会话之间进行distingush?

时间:2015-04-14 02:12:06

标签: http spring-mvc httpsession

我有一个非常简单的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会话,但它们具有相同的共享资源。

我如何区分它们?

2 个答案:

答案 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会话复​​制,这可能是一种更明智的方法。