Session是另一种记录客户状态的机制,与Cookie将客户状态保存在客户端浏览器中的形式不同,Session将客户状态保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。客户端浏览器再次访问时只需要从该Session中查找该客户的状态即可。
HttpSession接口是Java对Session机制的实现规范,它位于javax.servlet.http包中。
HttpSession对象在用户第一次访问网站的时候自动被创建,你可以通过调用HttpServletRequest的getSession方法获取该对象。getSession有两个重载方法:
HttpSession getSession()
HttpSession getSession(boolean create)
没有参数的getSession方法会返回当前的HttpSession,若当前没有,则创建一个返回。getSession(false)返回当前HttpSession,如当前会话不存在,则返回null。getSession(true)与没有参数的getSession方法一致,也是返回当前HttpSession,若当前没有,则创建一个。
可以通过HttpSession的setAttribute方法将值放入HttpSession,该方法签名如下:
void setAttribute(String name, Object value)
调用setAttribute方法时,若传入的name参数此前已经使用过,则会用新值覆盖旧值。
通过调用HttpSession的getAttribute方法可以取回之前放入的对象,该方法的签名如下:
Object getAttribute(String name)
注意,所有保存在HttpSession的数据不会被发送到客户端。
可以通过调用HttpSession的getId方法来读取Session的ID。Servlet容器为每个HttpSession生成唯一的标识,并为这个标识创建一个名为JSESSIONID的cookie。在后续的请求中,浏览器会将标识提交给服务端,这样服务器就可以识别该请求是由哪个用户发起的。
下面是几种使Session失效的方法:
- 在项目的部署描述文件中进行设置:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
该Session会在最后一次访问一分钟后失效
- 直接在应用服务器中设置。如果是tomcat,可以在tomcat目录下conf/web.xml中找到<session-config>元素,tomcat默认设置是30分钟,只要修改这个值即可。
- 对HttpSession调用setMaxInactiveInterval方法来设定其超时时间:
void setMaxInactiveInterval(int seconds)
- 对HttpSession调用invalidate方法强制使会话过期。
下面我们编写程序来创建一个Session:
package com.mc.hello;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = { "/mysession" })
public class SessionDemoServlet extends HttpServlet {
private static final long serialVersionUID = 36L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("name", "maconn");
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie cookie : cookies) {
out.print(cookie.getName() + " = " + session.getId());
}
}
else
out.print("no cookie");
}
}
第一次打开页面,由于之前此时还不存在Session,也就不存在JSESSIONID对应的cookie,此时网页上会显示"no cookie"。再次刷新页面,就会看到Session对应的JSESSIONID。
网友评论