对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域对象   

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" %>
<!DOCTYPE html>
<html>
<head>
    <title>获取session域对象</title>
</head>
<body>
    <%
        //获取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);
    %>
</body>
</html>

运行结果

 

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没有被销毁都是可以拿到值的),我们只能就往Session里面存,request请求只能一次拿到值。

Session对象的销毁

        1.默认时间到期

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

<! -- session默认的最大不活动时间。单位:分钟。—->
<session-config>
	<session-timeout>30</session-timeout>
</ session-config>

        不建议这样修改

        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失效则意味着此次会话结束,数据共享结束。

   

  • 40
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值