标签:session
| 序号 | 名称 | 数据存放位置 |
|---|---|---|
| 1 | Cookie技术 | 会话数据保存在浏览器客户端。 |
| 2 | Session技术 | 会话数据保存在服务器端。 |
Cookie的局限:
1)Cookie只能存字符串类型。不能保存对象
2)只能存非中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!
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) : 清除数据 |
问题: 服务器能够识别不同的浏览者!!!
代码解读: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
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
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有效时间
<!-- 修改session全局有效时间:分钟 --> <session-config> <session-timeout>60</session-timeout> </session-config>
完整的web.xml文件,如下:
<?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
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
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
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
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)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题
/**
* 手动发送一个硬盘保存的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
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信息");
}
}
}标签:session
原文地址:http://lsieun.blog.51cto.com/9210464/1782807