java中的session

Posted xuejiaqiang88

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的session相关的知识,希望对你有一定的参考价值。

会话技术
序号名称数据存放位置
1 Cookie技术 会话数据保存在浏览器客户端。
2 Session技术 会话数据保存在服务器端。

 

2、Session技术

 

 

2.1、引入

Cookie的局限:

1)Cookie只能存字符串类型。不能保存对象

2)只能存非中文。

3)1个Cookie的容量不超过4KB。

 

如果要保存非字符串,超过4kb内容,只能使用session技术!!!

Session特点:会话数据保存在服务器端。(内存中)

 

 

1.2、Session技术核心

HttpSession类:用于保存会话数据

 

Session相关API
序号类别API
1 创建或得到session对象

HttpSession request.getSession()

HttpSession request.getSession(boolean create)

2 设置session对象

void setMaxInactiveInterval(int interval)  : 设置session的有效时间

void invalidate()     : 销毁session对象

String getId()  : 得到session编号

3 保存会话数据到session对象

void setAttribute(String name, Object value)  : 保存数据

Object getAttribute(String name)  : 获取数据

void removeAttribute(String name) : 清除数据

 

 

 

1.3、Session原理

问题: 服务器能够识别不同的浏览者!!!

代码解读:HttpSession session = request.getSession();

1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

2)把JSESSIONID作为Cookie的值发送给浏览器保存

Cookie cookie = new Cookie("JSESSIONID", sessionID);

response.addCookie(cookie);

3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器

4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。

5)如果找到对应编号的session对象,直接返回该对象

6)如果找不到对应编号的session对象,则创建新的session对象,继续走1、2的流程

结论:通过JSESSIONID的cookie值在服务器找session对象!!!!!

 

获取或生成session对象Demo03.java

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
package com.rk.http.b_session;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
 
/**
 * 获取或生成session对象
 * @author lsieun
 *
 */
public class Demo03 extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        //通过访问HttpSession对象,使Tomcat服务器生成名为JSESSIONID的Cookie
        HttpSession session = request.getSession();
    }
 
}

显示session对象信息Demo04.java

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
31
32
33
34
35
package com.rk.http.b_session;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
/**
 * 显示session对象信息
 * @author lsieun
 *
 */
public class Demo04 extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
         
        HttpSession session = request.getSession(false);
        if(session != null)
        {
            out.write("JSSESSIONID: " + session.getId());
        }
        else
        {
            out.write("还没有Session对象");
        }
    }
 
}

 

 

1.4、Sesson细节

1)String getId()  : 得到session编号(也就是Cookie中JSESSIONID的值)

2)两个getSession方法:

getSession(true) / getSession(): 创建或得到session对象。没有匹配的session编号,自动创建新的session对象。

getSession(false):得到session对象。没有匹配的session编号,返回null

3)void setMaxInactiveInterval(int interval)  : 设置session的有效时间(单位:秒)

session对象销毁时间:

3.1 默认情况30分服务器自动回收

3.2 修改session回收时间

3.3 全局修改session有效时间

1
2
3
4
<!-- 修改session全局有效时间:分钟 -->
<session-config>
   <session-timeout>60</session-timeout>
</session-config>

完整的web.xml文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
   
  <!-- 修改session全局有效时间:分钟 -->
  <session-config>
      <session-timeout>60</session-timeout>
  </session-config>
   
 
</web-app>

 

3.4.手动销毁session对象 void invalidate(): 销毁session对象

 

向session中添加会话数据Demo05.java

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
package com.rk.http.b_session;
 
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
/**
 * 向session中添加会话数据
 * @author lsieun
 *
 */
public class Demo05 extends HttpServlet
{
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        HttpSession session = request.getSession();
        //向session中保存会话数据
        session.setAttribute("username""rk");
    }
 
}

修改session会话数据和有效时间Demo06.java

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
package com.rk.http.b_session;
 
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
/**
 * 修改session会话数据和有效时间
 * @author lsieun
 *
 */
public class Demo06 extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        HttpSession session = request.getSession();
        //向session中保存会话数据
        session.setAttribute("username""lsieun");
        //修改session的有效时间
        session.setMaxInactiveInterval(5*60);//保存为5分钟
    }
}

销毁session对象Demo07.java

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
package com.rk.http.b_session;
 
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
/**
 * 销毁session对象
 * @author lsieun
 *
 */
public class Demo07 extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        HttpSession session = request.getSession(false);
        if(session!=null){
            session.invalidate();//手动销毁
        }
        System.out.println("销毁成功");
    }
}

获取session的相关信息Demo08.java

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
31
32
33
34
35
36
37
38
39
40
package com.rk.http.b_session;
 
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
/**
 * 获取session的相关信息
 * @author lsieun
 *
 */
public class Demo08 extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
         
        HttpSession session = request.getSession(false);
        if(session!=null){
            String sessionId = session.getId();//获取JSESSIONID
            int maxInactiveInterval = session.getMaxInactiveInterval();//获取Session的有效时间
            String username = (String)session.getAttribute("username");//获取Session中的会话数据
            out.write("JSSESSIONID: " + sessionId + "<br/>");
            out.write("username: " + username + "<br/>");
            out.write("Session的有效时间是: " + maxInactiveInterval + "<br/>");
        }
        else
        {
            out.write("还没有Session对象");
        }
    }
}

 

 

 

4)在一些北京Java培训机构里面都讲过这个,如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题

1
2
3
4
5
6
7
/**
 * 手动发送一个硬盘保存的cookie给浏览器
 */
String sessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID",sessionId);
cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间
response.addCookie(cookie);

完整代码Demo09.java

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.rk.http.b_session;
 
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
/**
 * 案例:如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题
 * @author lsieun
 *
 */
public class Demo09 extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
         
        HttpSession session = request.getSession(false);
        if(session!=null){
            /**
             * 手动发送一个硬盘保存的cookie给浏览器
             */
            String sessionId = session.getId();
            Cookie cookie = new Cookie("JSESSIONID",sessionId);
            cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间
            response.addCookie(cookie);
             
            out.write("已经将JSESSIONID保存入Cookie,重启浏览器后,仍然可以看JSESSIONID信息。");
        }
        else
        {
            out.write("没有找到Session对象,重启浏览器后不会看到JSESSIONID信息");
        }
    }
}

 

以上是关于java中的session的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中的单行代码上设置计时器

学长今天告诉我 Java Web会话技术Session的简单使用

如何通过java中的电子邮件从数据库发送数据(表)?

java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

在线聊天室 --- 技术实现原理

jsch实现java sftp上传,在非root用户下出现permission dined异常,