session技术

来源:互联网 发布:php html转markdown 编辑:程序博客网 时间:2024/06/08 12:00

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);