先了解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域对象 和 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域对象 和 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文件中进行修改。
30
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失效则意味着此次会话结束,数据共享结束。