session讲解
什么是session

session相当于一个柜子,而sessionid相当于柜子的钥匙,只返回给用户一把钥匙(sessionid),我们可以往session里面存东西,只需要在取东西的时候用sessionid去取。而cookie是把存的数据也一起都给用户了。
- 服务器会给每一个用户创建一个session对象,
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
- 用户登录之后,整个网站都可以进行访问。:保存用户的信息,保存购物车信息
与servletcontext
都是数据共享的方式,但是session更好,因为servletcontext数据多的时候系统容易崩溃
实现数据使用session代码
//s1
package com.xin.servlet;
import com.xin.pojo.Person;
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;
import java.io.PrintWriter;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-16");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
session.setAttribute("name",new Person("熙熙",20));
String sessionId = session.getId();
if (session.isNew()){
resp.getWriter().write("创建成功:"+sessionId);
}else {
resp.getWriter().write("已经存在了:"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
//s2
package com.xin.servlet;
import com.xin.pojo.Person;
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;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-16");
HttpSession session = req.getSession();
Person person =(Person) session.getAttribute("name");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
package com.xin.pojo;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
注销session
- 手动注销:
当我们先注销session之后,再进入s2会报错500,空指针异常是因为person类异常,再重新先进入s1就会另外创建一个新id
package com.xin.servlet;
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;
public class SessionDemo03 extends HttpServlet {
@Override
//注销session
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//会马上注销但是会生成一个另外的新的,这是手动注销
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- 自动过期
web.xml配置设置有效期
<session-config>
<!--15分钟后session会自动失效,以分钟为单位,可以都写,在用户忘记注销时,页面自动可以注销-->
<session-timeout>15</session-timeout>
</session-config>
可以都写,在用户忘记注销时,页面自动可以注销
session使用场景
- 保存用户登录信息
- 购物车信息
- 经常在整个网站中会使用的数据,将他保存在session中。
session和cookie区别
sessionid是区分不同用户的标志,它可以通过cookie发送给用户。
- cookie是把用户的数据写到用户的浏览器,浏览器保存。(可以保存多个)
session是把用户的数据写到用户独占的session中,服务端保存(每个浏览器都不一样)。保存重要的信息,减少服务器资源的浪费。 - session对象由服务器创建
cookie是客户端发送请求后,响应过来创建的 - session可以存string和object
cookie只可以存string,不可以存object

浙公网安备 33010602011771号