在 Controller class 全局声明 HttpSession?

Declare HttpSession globally at the Controller class?

我在下面的控制器 class 中有 2 个 @RequestMapping,它们都有 HttpSession httpSession

是否可以全局声明 HttpSession httpSession,这样我就可以声明一次 HttpSession 并可以在多个函数中使用?

@Controller
public class ControllerClass{

    @RequestMapping(value="/sectionsAjax", method=RequestMethod.POST)
    public @ResponseBody String sectionsAjax(HttpSession httpSession){
        // Code
    }

    @RequestMapping(value="loadAjax", method=RequestMethod.POST)
    public @ResponseBody String sectionsAjax(HttpSession httpSession){
        // Code
    }
}

我认为您可以在控制器中自动装配 HttpSession:

@Autowired
private HttpSession session;

在请求的上下文中没有 运行,您可能没有 HttpSession 可用。即使在请求的上下文中,也可能(还)没有创建会话。

可能适合您的情况(尽管它并不比您当前的方法好)是使用 spring 的 RequestContextHolder

类似

public static HttpSession getHttpSession() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    return attr.getRequest().getSession(true);
}

将始终在 servlet 容器中工作(在添加对 getRequestAttributes 的检查后不返回 null)(创建会话,如果有 none)。

扩展一下,正如您询问将 HttpSession 注入(或 "globally declaring")到您的控制器中一样。 Spring 的控制器(即底层 Java 对象)是非常长寿命的单例对象,具有所谓的 "singleton scope"。会话是 "session scope" 的对象,因此不能直接注入控制器(依赖项必须同样或更长寿)。人们可以使用代理(在这种情况下具有单例范围)解析具有例如的值。会话范围;但这不值得为您的情况带来麻烦。有关更多信息,请查看 spring 的非常好的参考资料,特别是在 Bean scopes.

章节