在前面一篇讲Cookie的文章中我提到了会话的概念,->Cookie,这个Seesion就是一个会话。关于seesion我们有几点需要知道:
我们从简单的获取Session入手,看看Sessio都有哪些信息。
package com.tyz.session;
import javax.servlet.ServletException;
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的基本操作
* @author tyz
*/
public class CreateSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//得到Session
HttpSession session = req.getSession();
//向Session中存数据
//区别于Cookie,Cookie的键值都是String,Session值可以是对象
session.setAttribute("name", "Jessica");
//获取Session的ID
String id = session.getId();
//判断Session是不是新创建的
if (session.isNew()) {
resp.getWriter().write("This session is new: " + id);
} else {
resp.getWriter().write("This session is old: " + id);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注释我已经写得很清晰了,session的这几个操作都比较简单,在后面我有一个判断,如果seesion已经存在了,我们就输出This is old:
并加上这个session的ID, 否则就输出的是This is new:
加上ID。
我们来看看运行结果。
输出的是This session is old
,也就是session已经存在了。这就是我们上面说的,服务器会给每个用户都建立一个Session,在网站被关闭后才会消失。
所以在我们获取客户端的cookie的时候,必然存在一个cookie就是我们圈起来的这个session,在打开浏览器的时候它就出现了。
可以看到,在Request的header里,被加入了这么一个cookie:
好了。现在我们再来建一个servlet,因为在当前这里我们是建了一个session的,现在我们把它取出来。
我们建立一个获取session值的servlet如下
package com.tyz.session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author tyz
*/
public class GetSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码问题
// req.setCharacterEncoding("utf-8");
// resp.setCharacterEncoding("utf-8");
// resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
//得到session的值
String name = (String) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
首先我们先进入/putS,把session放进去
接着进入/getS
在前面的注释中我说了,seesion和cookie存数据的一个区别就是cookie规定的value之只能是String
,但是session是Object
,也就是可以存一个对象进session。
为了验证,我们先建一个简单的类。
package com.tyz.object;
/**
* @author tyz
*/
public class Person {
private String name;
private int age;
private boolean gender;
public Person(String name, int age, boolean gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return this.name + " " + (this.gender ? "Male" : "Female") + " " + this.age;
}
}
现在我们把这个类的对象存入session。
那获取session就变成下面这样
结果如下,可以看到输出了我们生成的一个Person对象
我们知道,Servlet中的ServletContext
在不同的servlet之间也是共享数据的,所以可以用来存取数据,但是它并没有session强大,如果服务器很多用ServletContext
可能就爆炸了,虽然session也不能存太多数据,但还是要比ServletContext
好很多。
那接下来我们再来看看Session的删除和注销。
session删除也是只有一行代码。
我们先不存session,直接取一下,看会得到什么。
可以看到在不用我们第一个存放session的servlet的情况下,直接取会取到null,现在我们先存放,再用刚写的删除,然后再取一下。
所以这个removeAttribute()
就是帮我们把这个session的对象给删除了,不存在这条数据了。接下来我们看注销。
加入这行代码之后再运行看上去结果是一样的,有的浏览器可能会在注销后再取得seesion报出异常,有的则不会,后台仍然是输出了一个null。
那removeAttribute()
和invalidate()
到底有什么区别呢?我补充一下。
具体点说就是removeAttribute()
是从session删除指定名称的绑定对象,也就是说调用此方法后再调用getAttribute(name)
时,不能获取指定名称的绑定对象,但是session还存在。invalidate()
就是销毁此session对象,session对象中绑定的那些对象值也都不存在了.
上面实现的是一种手动注销的方法,在web.xml
中还可以配置session,让它自动注销。
现在我们设置一个session试一下。
过了一分多钟我又get了一下seesion
在上一篇文章我写了 Cookie ,现在我们学了Session之后再来总结一下它们之间的区别。
Session最常见的使用场景就是保存用户的登录信息了,还有就是保存购物车信息啊,网站中常用的信息诸如此类。