美文网首页
Servlet和JSP学习总结(八)--Session

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

作者: madlike | 来源:发表于2017-08-17 13:17 被阅读0次

    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概述

    相关文章

      网友评论

          本文标题:Servlet和JSP学习总结(八)--Session

          本文链接:https://www.haomeiwen.com/subject/fgygrxtx.html