欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet和JSP学习总结(八)--Session

程序员文章站 2024-03-20 12:25:58
...

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。

下一篇:Servlet和JSP学习总结(九)--JSP概述