Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
Session和Cookie的主要区别
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session实现原理
package cn.hncu.servlet2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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;
public class SaveServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
// 把name分别存入3个容器中
request.setAttribute("name", name + "_request");
request.getSession().setAttribute("name", name + "_session");
ServletContext application = getServletContext();
application.setAttribute("name", name + "_application");
}
}
package cn.hncu.servlet2;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Random;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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;
public class GetServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
String requestName = (String) request.getAttribute("name");
out.println("request:" + requestName);
// request代表一次请求 每次都是独立的
String sessionName = (String) request.getSession().getAttribute("name");
out.println("sesstion:" + sessionName);
// 该浏览器中多个请求甚至是多个页面是共享同一个session容器的
// 如果关闭浏览器再打开,则是另一个session容器
String ApplicationName = (String) getServletContext().getAttribute(
"name");
out.println("application:" +ApplicationName);
// application:代表一个项目,不但是多个请求 甚至是多个用户(都是共享该容器)
// 只要tomcat不关闭这个容器一直存在
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
浏览器中多个请求甚至是多个页面是共享同一个session容器的如果关闭浏览器再打开,则是另一个session容器
当用户退出某个系统但没关闭浏览器时,session其实还会存在一段时间,为了安全性考虑,当用户退出后,应该销毁掉session
package cn.hncu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LogOutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
// 安全退出
HttpSession s = request.getSession();
s.invalidate();// 让sesstion对象失效
response.sendRedirect("index.jsp");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
本来,浏览器关闭之后重启。上一次的用户临时信息是访问不了的 把cookie和session技术联合起来,实现让用户不小心关闭浏览器,页面数据不丢失,用户的临时信息还能在5分钟之内重启浏览器有效 我们在服务器端写代码手动创建一个名为JSESSIONID=。。。的普通cookie,发向客户端
String id = request.getSession().getId();// 拿到该用户的session id
Cookie c = new Cookie("JSESSIONID", id);
c.setMaxAge(60 * 5);
c.setPath(request.getContextPath());
response.addCookie(c);