持续创作,加速成长!这是我参与「掘金日新计划 · 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);
}
}
结果如下:
Servlet中使用HttpSessionRequest对象的getSession方法来取得当前用户的会话。 关于使用HttpSession来存储访问次数的内容就很清晰,获取会话对象、 从会话中获取属性、将属性信息存入会话。