Java中Session的详解

时间:2022-12-02 12:39:40

1.什么是session:

服务器会给每一个用户(浏览器)创建一个session对象

一个session独占一个浏览器,只要浏览器不关闭,这个session就一直存在

session称为会话控制,存储用户会话所需的属性和配置信息,这样,用户在应用程序的web页面跳转时,存储在session对象中的用户信息不会丢掷,而是在整个用户会话中一直保持下去

2.session的经典应用场景:

一个用户登陆后,访问该网站的其他网页时,一直处于登录状态

保存购物车信息等等

3.session中常用的方法

getId():获取session的唯一标识

getServletContext():代表整个web服务

getAttribute(String):获取session的节点,比如你在其中一个Servlet中通过setAttribute(String,Object)配置了相关的session信息,然后通过另一个Servlet获取这个Servlet中的session信息,就要用到getAttribute(String)这个方法

setAttribute(String,Object):设置session节点

removeAttribute(String):一出一个session节点

isNew():判断一个session是否是一个新的session

invalidate():注销session的

4.举例

例1:创建一个session并获取到session的ID,判断这个session是否是新的session

步骤1:新建一个maven项目,使用webapp模板

步骤2:在Java文件夹下创建一个com.xiaoma.servlet.SessionDemo01的类,编写servlet类文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.xiaoma.servlet;
import com.xiaoma.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 SessionDemo01 extends HttpServlet {
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //解决中文乱码
         resp.setHeader("content-type","text/html;charset=UTF-8");
         //得到session
         HttpSession session = req.getSession();
         //通过setAttribute方法向Session中存放信息
         session.setAttribute("name","小马");
         //获取session相关信息,包括id,是否是新的session等
         String sessionId = session.getId();
         if(session.isNew()) {
             resp.getWriter().write("创建Session成功,ID为:" + sessionId);
         }else{
             resp.getWriter().write("Session已经存在了,ID为:" + sessionId);
         }
     }
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         doGet(req, resp);
     }
 }

步骤3:配置XML文件

?
1
2
3
4
5
6
7
8
<servlet>
         <servlet-name>SessionDemo01</servlet-name>
         <servlet-class>com.xiaoma.servlet.SessionDemo01</servlet-class>
     </servlet>
     <servlet-mapping>
         <servlet-name>SessionDemo01</servlet-name>
         <url-pattern>/s1</url-pattern>
     </servlet-mapping>

例2:从一个servlet中读取另一个servlet中的session信息

步骤1:在Java文件夹下创建一个com.xiaoma.servlet.SessionDemo01的类,编写servlet类文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.xiaoma.servlet;
 import com.xiaoma.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 SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码
        resp.setHeader("content-type","text/html;charset=UTF-8");
        //得到session
        HttpSession session = req.getSession();
        //通过setAttribute方法向Session中存放信息
        session.setAttribute("name","小马");
        //获取session相关信息,包括id,是否是新的session等
        String sessionId = session.getId();
        if(session.isNew()) {
            resp.getWriter().write("创建Session成功,ID为:" + sessionId);
        }else{
            resp.getWriter().write("Session已经存在了,ID为:" + sessionId);
       }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

步骤2:在Java文件夹下创建一个com.xiaoma.servlet.SessionDemo02的类,编写另一个用来读取的servlet类,通过SessionDemo02来读取SessionDemo01中的session信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.xiaoma.servlet;
 import com.xiaoma.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 {
        //解决中文乱码
       resp.setHeader("content-type","text/html;charset=UTF-8");
        //得到session
        HttpSession session = req.getSession();
        String name=(String) session.getAttribute("name");
        resp.getWriter().write(name);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

步骤3:配置xml文件

?
1
2
3
4
5
6
7
8
<servlet>
    <servlet-name>SessionDemo02</servlet-name>
   <servlet-class>com.xiaoma.servlet.SessionDemo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionDemo02</servlet-name>
    <url-pattern>/s2</url-pattern>
</servlet-mapping>

例3:session中还可以存放对象信息

步骤1:在Java文件夹下创建一个com.xiaoma.pojo.Person的类,编写我们的实体类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.xiaoma.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 +
                '}';
    }
}

步骤2:在Java文件夹下创建一个com.xiaoma.servlet.SessionDemo01的类,编写servlet类文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.xiaoma.servlet;
 import com.xiaoma.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 SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //解决中文乱码
        resp.setHeader("content-type","text/html;charset=UTF-8");
       //得到session
        HttpSession session = req.getSession();
        //通过setAttribute方法向Session中存放信息
        session.setAttribute("name",new Person("小马",18));
        //获取session相关信息,包括id,是否是新的session等
        String sessionId = session.getId();
        if(session.isNew()) {
            resp.getWriter().write("创建Session成功,ID为:" + sessionId);
        }else{
            resp.getWriter().write("Session已经存在了,ID为:" + sessionId);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

步骤3:在Java文件夹下创建一个com.xiaoma.servlet.SessionDemo02的类,编写另一个servlet类文件,用来读取SessionDemo01中的Session对象信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.xiaoma.servlet;
  import com.xiaoma.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 {
         //获取session中的Person对象
         //解决中文乱码
         resp.setHeader("content-type","text/html;charset=UTF-8");
         //得到session
         HttpSession session = req.getSession();
         Person person=(Person) session.getAttribute("name");
         resp.getWriter().write(person.toString());
     }
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         super.doPost(req, resp);
     }
 }

步骤4:编写xml文件,与上同理

例4:注销session(注销session有两种方式,一种是通过removeAttribute(String)方法,另一种是通过xml配置文件)

第一种,通过removeAttribute(String)方法,这种方式是使session手动过期

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  package com.xiaoma.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
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //得到session
         HttpSession session = req.getSession();
         //手动注销session
        session.removeAttribute("name");
         session.invalidate();
     }
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         super.doPost(req, resp);
     }
}

第二种,通过xml文件的方法,这种方式是时session自动过期

?
1
2
3
4
5
<!--设置session的存活时间-->
<session-config>
    <!--以分钟为单位-->
    <session-timeout>1</session-timeout>
</session-config>

5.session与cookie的区别

  ·(1)cookie是吧用户的数据写给浏览器,浏览器保存(可以保存多个)

  ·(2)session是把用户的数据写给用户独占的session中,服务器保存(保存重要信息,避免浪费服务器资源)

  ·(3)session是由服务器创建的

原文链接:https://www.cnblogs.com/XiaoMaGuai/p/15374013.html