什么是session
1) 服务器会给每个用户(浏览器)创建一个session对象
2)一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
3)用户登录之后,整个网站它都可以访问 。-->保存用户的信息;保存购物车的信息
session中的方法
测试代码:
session和cookie的区别:
1)cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)。session是把用户的数据写入到用户独占session中,服务端保存(保存重要的信息,密码,减少服务器资源的浪费)
2)session是由服务器创建
session使用场景:
1)保存一个登陆用户的信息
2)购物车信息
3)在整个网站中经常会使用的数据我们将它保存在session中
使用session
1)Demo01:
1 public class SessionDemo01 extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 // 解决乱码问题 5 resp.setCharacterEncoding("UTF-16"); 6 req.setCharacterEncoding("UTF-16"); 7 resp.setContentType("text/html;charset=utf-8"); 8 9 // 得到session 10 HttpSession session = req.getSession(); 11 12 13 // 给cookie中存东西 14 session.setAttribute("name",new Person("尹雄",1)); 15 16 17 // 获取session的id 18 String id = session.getId(); 19 20 // 判断session是不是新创建的 21 if (session.isNew()) { 22 resp.getWriter().write("session创建成功,sessionID为" + id); 23 } else { 24 resp.getWriter().write("session已经在服务器中存在,sessionID为" + id); 25 } 26 27 // session创建的时候做了什么 28 Cookie cookie = new Cookie("JSESSIONID", id); 29 resp.addCookie(cookie); 30 31 32 } 33 34 @Override 35 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 36 doGet(req, resp); 37 } 38 }
2)Demo02
1 public class Person { 2 private String name; 3 private int age; 4 5 public Person() { 6 } 7 8 public Person(String name, int age) { 9 this.name = name; 10 this.age = age; 11 } 12 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public void setAge(int age) { 19 this.age = age; 20 } 21 22 public String getName() { 23 return name; 24 } 25 26 public int getAge() { 27 return age; 28 } 29 30 @Override 31 public String toString() { 32 return "Person{" + 33 "name='" + name + '\'' + 34 ", age=" + age + 35 '}'; 36 } 37 }
public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 解决乱码问题 resp.setCharacterEncoding("UTF-16"); req.setCharacterEncoding("UTF-16"); resp.setContentType("text/html;charset=utf-8"); // 得到session HttpSession session = req.getSession(); Person person = (Person) session.getAttribute("name"); System.out.println(person); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
3)Demo03
1 public class SessionDemo03 extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 HttpSession session = req.getSession(); 5 session.removeAttribute("name"); 6 // 手动注销session 7 session.invalidate(); 8 } 9 10 @Override 11 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 12 doGet(req, resp); 13 } 14 }
自动注销session
在web.xml中
<!-- 设置session失效时间--> <session-config> <!-- 1分钟后,session自动失效,以分钟为单位--> <session-timeout>1</session-timeout> </session-config>
问题:
servlet中request内置对象是封装了客户端发给服务端的请求数据,也是只能操作客户端提交过来的数据
但是session对象是在存在服务端的,为啥获取session是用request获取,而不是response呢?
解答:
因为服务端虽然存session,但是不知道session和哪个客户端对应,所以必须客户端request的时候携带个session id,服务器端才能通过该id找到对应的session和客户端关联。所以服务器端单纯获得session没意义,因为不知道是哪个客户端的,只有从客户端来获取session才有意义。