session技术

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值