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类:用于保存会话数据
序号 | 类别 | 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 { 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 Web会话技术Session的简单使用