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 { 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信息"); } }}
|
浙公网安备 33010602011771号