我是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吗?
答案 0 :(得分:6)
您在示例中所做的与cookie无关。 session.setAttribute(“key”,valueObject); 在会话中设置java对象。会话保存在服务器上。 sessionid是唯一传达回客户端的东西。它可以是cookie,也可以是URL。会话中的属性未序列化为字符串。
另一方面,Cookie是发送回客户端的字符串。客户有责任存储他们的cookie(有些人将其关闭)并将其返回服务器。
从复杂的对象图设置cookie值需要序列化和反序列化。会话属性不会。
如果您想阅读cookie,请使用:
@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对象,然后您可以设置属性(就像您在问题中所做的那样)。