对Session对象的了解

先了解Session

         Session 用来表示一次会话,在一次会话中数据是可以共享的,这时session作为域对象存在,可以通过setAttribute(name,value)方法向域对象中添加数据,通过getAttribute(name)从域对象中获取数据,通过removeAttribute(name)从域对象中移除数据。

        Session的创建     

package com;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * Session对象的获取
 *        request.getSession()
 *        当获取session对象时,会先判断session对象是否存在。如果存在会获取session对象;
 *                                                  如果不存在则会创建session对象
 *  常用方法
 *         获取session的会话标识符       geiId()
 *         获取session的创建时间         getCreationTime()
 *         获取最后一次访问时间           getLastAccessedTime()
 *         判断是否是新的session对象      isNew()
 *
 */
@WebServlet("/ss01")
public class Session01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Session
        HttpSession session = request.getSession();
        //获取Session的会话标识符
        String id = session.getId();
        System.out.println(id);
        //获取Session的创建时间
        System.out.println(session.getCreationTime());
        //获取Session最后一次的访问时间
        System.out.println(session.getLastAccessedTime());
        //判断是否为新的Session对象
        System.out.println(session.isNew());
    }
}

运行结果

对Session对象的了解_第1张图片

 

 Session域对象    对Session对象的了解_第2张图片

Session域对象 和 request域对象进行对比(通过请求转发到jsp页面)

                                                注意:请求转发是一次请求,此时request是可以拿到值的

                                                                                                Session也是可以拿到值的

package com;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 *Session域对象
 *          setAttribute()       设置域对象
 *          getAttribute()       获取域对象
 *          removeAttribute()    移除域对象
 *
 *     请求转发
 *          一次请求
 *          request作用域有效
 *          session作用域有效
 *     重定向
 *          两次请求
 *          request作用域无效
 *          session作用域有效
 */
@WebServlet("/ss02")
public class Session02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*Session域对象*/
        //获取Session
        HttpSession session = request.getSession();
        //设置域对象
        session.setAttribute("uname","zhangsan");
        session.setAttribute("upwd","123456");
        //移除域对象
        session.removeAttribute("upwd");

        /*request域对象*/
        request.setAttribute("name","zhangsan");

        //请求转发到jsp页面
        request.getRequestDispatcher("index.jsp").forward(request,response);

    }
}

jsp页面

<%@ page contentType="text/html; charset=UTF-8"  language="java" %>



    获取session域对象


    <%
        //获取Session域对象
        String uname = (String) request.getSession().getAttribute("uname");
        String upwd = (String) request.getSession().getAttribute("upwd");

        //获取request域对象
        String name = (String) request.getAttribute("name");

        System.out.println("uname:"+uname+",upwd:"+upwd+",name:"+name);
    %>

运行结果

对Session对象的了解_第3张图片

 

Session域对象 和 request域对象进行对比(重定向到jsp页面)

                                                注意:重定向是两次请求,request就会失效,是拿不到值的

                                                                                    Session不会失效,是可以拿到值的

package com;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 *Session域对象
 *          setAttribute()       设置域对象
 *          getAttribute()       获取域对象
 *          removeAttribute()    移除域对象
 *
 *     请求转发
 *          一次请求
 *          request作用域有效
 *          session作用域有效
 *     重定向
 *          两次请求
 *          request作用域无效
 *          session作用域有效
 */
@WebServlet("/ss02")
public class Session02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*Session域对象*/
        //获取Session
        HttpSession session = request.getSession();
        //设置域对象
        session.setAttribute("uname","zhangsan");
        session.setAttribute("upwd","123456");
        //移除域对象
        session.removeAttribute("upwd");

        /*request域对象*/
        request.setAttribute("name","zhangsan");

       /* //请求转发到jsp页面
        request.getRequestDispatcher("index.jsp").forward(request,response);*/

        //重定向到jsp页面
        response.sendRedirect("index.jsp");

    }
}

 结果

对Session对象的了解_第4张图片

总结:以后想要多次请求都能拿到的数据(只要Session没有被销毁都是可以拿到值的),我们只能就往Session里面存,request请求只能一次拿到值。

Session对象的销毁

        1.默认时间到期

           当客户端第一次请求servlet并且操作session时,session对象生成,Tomcat中session默认的存活时间为30min,即你不操作界面的时间,一旦有操作,session 会重新计时。session的默认时间可以改。可以在Tomcat中的conf目录下的web.xml文件中进行修改。



	30

        不建议这样修改

        2.自己设定到期时间

             当然除了以上的修改方式外,我们也可以在程序中自己设定session的生命周期,通过session.setMaxInactiveInterval(int)来设定session的最大不活动时间,单位为秒。

//获取session对象
Httpsession session = request.getsession();
//设置session的最大不活动时间
session.setMaxInactiveInterva1(15); // 15秒

      当然我们也可以通过getMaxInactiveInterval()方法来查看当前Session对象的最大不活动时间。

       

        3.立刻失效

        我们也可以通过session.invalidate()方法让session立刻失效。

//销毁session对象
session.invalidate();

        4.关闭浏览器

        从前面的JESSION可知道,session的底层依赖cookie 实现,并且该cookie的有效时间为关闭浏览器,从而session在浏览器关闭时也相当于失效了(因为没有JSESSION再与之对应)。

       5. 关闭服务器          

           当关闭服务器时,session 销毁。
           Session失效则意味着此次会话结束,数据共享结束。

   

你可能感兴趣的:(java,前端,服务器)