文章目录
Session详解
一、什么是Session
- Session是一个接口(HttpSession)
- Session是一个会话,用来维护一个客户端和服务器之间关联的技术
- 每个客户端都有自己的Session会话
- 我们经常在Session中保存用户登录后的信息
那么,Session怎么创建和使用呢?请看下面:
二、Session的使用
后边所说的HttpSession是全文所说的Session的类,Session是一种习惯的叫法。
这里先新建一个session.html文件,以便后边演示使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Session学习实例</title>
<base href="http://localhost:8080/Cookie/">
<style type="text/css">
iframe{
position: absolute;
left: 500px;
top: 0px;
}
ul li{
width: 300px;
list-style: none;
}
</style>
</head>
<body>
<div>
<ul>
<li><a href="" target="target">Session的创建和获取</a></li>
<li><a href="" target="target">Session域数据的存储</a></li>
<li><a href="" target="target">Session域数据的获取</a></li>
<li>Session的存活</li>
<li>
<ul>
<li><a href="" target="target">Session的默认超时及配置</a></li>
<li><a href="" target="target">Session 3秒超时销毁</a></li>
<li><a href="" target="target">Session 马上销毁</a></li>
</ul>
</li>
<li><a href="" target="target">浏览器和Session绑定的原理</a></li>
</ul>
</div>
<iframe name="target" width="500" height="500"></iframe>
</body>
</html>
再写一个BaseServlet.java:
package com.hstc.edu;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post请求中文乱码问题
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// 调用目标业务方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.1 创建、获取Session
创建和获取都使用同一个API——request.getSession(),功能如下:
- 当第一次调用该接口的时候,系统会创建一个Session会话
- 之后调用则都是获取第一次创建好的Session会话对象
如果我们不知道这个Session是不是新的怎么办呢,可以调用HttpSession对象的方法isNew() 来判断。返回true表示第一次创建,返回false表示已创建,此时的HttpSession对象是调用第一次创建的HttpSession对象。
对于每一个Session,都会有一个唯一标记的id值,使用 getId() 方法即可获取。
直接来一波代码演示:
package com.hstc.edu;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionServlet extends BaseServlet{
static int num = 1;
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//创建和获取Session对象
HttpSession session = req.getSession();
//判断是否是新创建的
boolean isNew = session.isNew();
//获取Session的id值
String id = session.getId();
resp.getWriter().write("第"+num+"次调用getSession获得的isNew的值为: "+isNew+"<br>");
resp.getWriter().write("id值为:"+id+"<br>");
num++;
}
}
然后在web.xml下注册:
<servlet>
<servlet-name>SessionServlet</servlet-name>
<servlet-class>com.hstc.edu.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionServlet</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
然后在html中修改此a标签的href值
<li><a href="session?action=createOrGetSession" target="target">Session的创建和获取</a></li>
然后运行服务器,第一次点击显示:
之后点击结果显示:
可见,isNew值变为了false,且id值不变。
2.2 Session域数据的存和取
在SessionServlet类中添加方法:
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//存
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("成功设置attribute");
}
protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws IOException {
//取
Object attribute = request.getSession().getAttribute("key1");
response.getWriter().write("从Session中获取得到的key1的值为: "+attribute);
}
在html5中添加a标签的href路径:
<li><a href="session?action=setAttribute" target="target">Session域数据的存储</a></li>
<li><a href="session?action=getAttribute" target="target">Session域数据的获取</a></li>
比较简单,就不演示了。
2.3 Session生命周期控制
public void setMaxInactiveInterval(int interval) 设置Session的超时时间,超过指定时长,Session就会自动销毁。(interval以秒为单位,默认是1800,也就是30分钟)
**public void getMaxInactiveInterval()**获取Session的超时时间
如果想修改某个工程session的默认时长,可以在web.xml中添加以下标签:
<session-config>
<!--10表示10分钟-->
<session-timeout>10</session-timeout>
</session-config>
如果要用代码修改当然也行,请看:
在SessionServlet中添加方法:
//获取默认的session时长
protected void getDefaultLife(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
int time = session.getMaxInactiveInterval();
response.getWriter().write("session的默认超时时长为:"+time);
}
//将session的存活时长改为3s
protected void set3secondLife(HttpServletRequest request,HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(3);
response.getWriter().write("当前Session的默认时长已经设置为3秒");
}
//设置session每次创建都立即销毁
protected void set0secondLife(HttpServletRequest request, HttpServletResponse response) throws IOException{
HttpSession session = request.getSession();
//使用invalidate方法让session马上到时
session.invalidate();
response.getWriter().write("会话已删除");
}
在html中设置这几个标签:
<li><a href="session?action=getDefaultLife" target="target">Session的默认超时及配置</a></li>
<li><a href="session?action=set3secondLife" target="target">Session 3秒超时销毁</a></li>
<li><a href="session?action=set0secondLife" target="target">Session 马上销毁</a></li>
之后重启服务器,自己操作一下就懂了。
知识点:
1、使用session.getMaxInactiveInterval()可以获取session的超时时间。
2、使用session.setMaxInactiveInterval(int num)可以设置session的超时时间(num表示秒)。
3、使用session.invalidate();可以立马销毁session。
4、使用session.setMaxInactiveInterval(int num)时,如果num < 0 那么,该session永久存活,不太常见,容易出问题。