会话技术
序号 |
名称 |
数据存放位置 |
1 |
Cookie技术 |
会话数据保存在浏览器客户端。 |
2 |
Session技术 |
会话数据保存在服务器端。 |
Cookie的局限:
1)Cookie只能存字符串类型。不能保存对象
2)只能存非中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!
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) : 清除数据
|
问题: 服务器能够识别不同的浏览者!!!
代码解读: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)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信息" );
}
}
}
|
时间: 2024-11-03 21:38:09