关于HttpSession

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

什么是HttpSession,作用是什么?

为了消除代码中手工管理会话信息的需要(无论使用什么样的会话方式),Servlet定义了HttpSession接口以便于Servlet容器进行会话跟踪。下面用一个实例来演示如何用HttpSession来存储会话中用户访问站点的次数。

获取HttpSession对象

HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回; HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null;

     package com.Servlet;

    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import jakarta.servlet.http.HttpSession;

    import java.io.IOException;
    import java.sql.Date;
    import java.text.DateFormat;

    /**
     * Servlet implementation class HitCounter
     */
    public class HitCounter extends HttpServlet {
            private static final long serialVersionUID = 1L;
            private static final String COUNTER_KEY="counter";
            /**
             * @see HttpServlet#HttpServlet()
             */
            public HitCounter() {
                    super();
                    // TODO Auto-generated constructor stub
            }

            /**
             * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
             *      response)
             */
            protected void doGet(HttpServletRequest request, HttpServletResponse response)
                            throws ServletException, IOException {
                    // TODO Auto-generated method stub
                    response.getWriter().append("Served at: ").append(request.getContextPath());
                    // response.setContentType("text/html;charset=UTF-8");
                    // PrintWriter out = response.getWriter();
                    // TODO Method stub generated by Lomboz
    //		获取会话对象
                    HttpSession session = request.getSession(true);
                    response.setContentType("text/html;charset=gb2312");
    // Get the PrintWriter to write the response
                    java.io.PrintWriter out = response.getWriter();
    // 从会话中获取属性
                    int count = 1;
                    Integer i = (Integer) session.getAttribute(COUNTER_KEY);
    // If a previous count exists, set it
                    if (i != null) {
                            count = i.intValue() + 1;
                    }
    // 将属性信息存入会话
                    session.setAttribute(COUNTER_KEY, new Integer(count));
                    Date lastAccessed = new Date(session.getLastAccessedTime());
                    Date sessionCreated = new Date(session.getCreationTime());
                    DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
    // Print a standard header
                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>会话计数器</title>");
                    out.println("</head>");
                    out.println("<body>");
                    out.println("你的会话ID: <b>" + session.getId() + "<br>");
                    out.println("会话创建时间:" + formatter.format(sessionCreated) + "<br>");
                    out.println("会话上次访问时间:" + formatter.format(lastAccessed) + "<br>");
                    out.println("</b> 会话期间你对页面发起 <b>" + count + "</b> 次请求");
                                out.println("<form method=GET action=\"" + request.getRequestURI() + "\">");
                    out.println("<input type=submit " + "value=\"再次单击...\">");
                    out.println("</form>");
                    out.println("</body>");
                    out.println("</html>");
                    out.flush();

                    out.close();
            }

            /**
             * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
             *      response)
             */
            protected void doPost(HttpServletRequest request, HttpServletResponse response)
                            throws ServletException, IOException {
                    // TODO Auto-generated method stub
                    doGet(request, response);
            }

    }

结果如下:

34.PNG

Servlet中使用HttpSessionRequest对象的getSession方法来取得当前用户的会话。 关于使用HttpSession来存储访问次数的内容就很清晰,获取会话对象、 从会话中获取属性、将属性信息存入会话。