在控制器内创建会话cookie

时间:2011-05-01 09:38:05

标签: spring spring-mvc

我是Tomcat,servlets和Spring Web的新手。我来自PHP背景,所以至少可以说我有点迷失方向。我想让控制器为我创建一个会话cookie。

我被告知我可以在标准的servlet中获得这样的会话:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
  // Somewhere inside the method...
  HttpSession session = request.getSession(true);

  // Set a cookie
      session.setAttribute("hello", "world");

  // More stuff...
}

这如何转化为Spring Web MVC的做事方式?我可以在控制器中创建会话cookie吗?

3 个答案:

答案 0 :(得分:6)

您在示例中所做的与cookie无关。 session.setAttribute(“key”,valueObject); 在会话中设置java对象。会话保存在服务器上。 sessionid是唯一传达回客户端的东西。它可以是cookie,也可以是URL。会话中的属性未序列化为字符串。

另一方面,Cookie是发送回客户端的字符串。客户有责任存储他们的cookie(有些人将其关闭)并将其返回服务器。

从复杂的对象图设置cookie值需要序列化和反序列化。会话属性不会。

如果您想阅读c​​ookie,请使用:

@CookieValue("key") String cookie

在控制器参数列表中。 cookie变量将使用名为“key”的cookie中的值填充。

要设置Cookie,请致电:

response.addCookie(cookie);

答案 1 :(得分:4)

在Java Servlets(特别是Spring MVC)中,您不直接与会话cookie交互,实际上正确编写的基于servlet的应用程序应该在没有启用cookie的情况下工作,自动回退到基于URL的会话ID。

你提供的方式是正确的,虽然Spring为你提供了更好(更高级别)的方法,比如session-scoped bean。这样你就不会与会话本身互动。

答案 2 :(得分:2)

您可以通过在控制器的方法中将其作为参数包含来访问HttpSession对象:

public String get(Long id, HttpSession session) {

}

Spring将为您注入当前的HttpSession对象,然后您可以设置属性(就像您在问题中所做的那样)。