一.Session的原理:
1.利用Cookie在客户端浏览器中保存了Session的ID
ID 不是敏感信息, 是随机生成的
2.在用户第一次访问网站时候生成Session ID
3.服务器端为每个Session ID分配了一个缓存集合(Map)
4.每个用户的Session ID 不重复, 每个用户都有属于自己的一个Session缓存(集合)
5.这个Session集合是保存到服务器端的, 可以存储任何敏感信息, 客户端不可见!
6.Session可以通过request对象得到, 其类型为 HttpSession
7.在JSP中session是内置对象 或者 从PageContext中获得.
8.为了避免服务器内存过度消耗, 如果 Session 对象从最后一次访问开始计时超过20分钟没有使用, 则销毁.
session对象的超时销毁时间可以在web.xml中设置.
二.关键要点:
每个用户(浏览器)对应唯一的一个Session对象
Session对象保存在服务器
Session的ID利用Cookie保存在客户端
Session对象超时销毁.
三.比较Cookie与Session
1.Cookie的数据存在客户浏览器端,明码保存
(1)Cookie没有数据安全性,不适合保存敏感数据
(2)一般用于保存文本的ID数据
2.Cookie只能保存文本数据
(1)数据量不能太大,一般不超过4k
(2)其编码是ISO8859-1,存储中文和特殊字符需要编码
3.Session保存在服务器端
(1)客户不能直接看到,Session可以安全保存数据
(2)Session不能持久保存数据,会超时删除的!持久数据应该放在数据库中.
(3)Session中可以存储大量数据,服务器会利用硬盘进行缓存数据
缓存时候是利用对象序列化技术实现!但是会变慢.
4.Session是ID是利用Cookie存储在客户端的!
(1)如果客户端不能存储Session ID,Session 失效
(2)或者删除Session ID 则Session失效
四.JSTL EL 与 Session
在JSP中可以利用 JSTL EL 访问 Session 中的数据
EL 表达式的查找过程:
1.EL 表达式在默认情况下 按照先后次序在 pageContext,request,
session和application空间中查找变量,先找到为准!
(1)返回数据时候调用其方法 xxx.getAttribute(name)
2.如果需要在特定的范围内查找数据请使用内置对象:pageScope,requestScope,
sessionScope,applicationScope
五.浏览器禁用Cookie,则实现URL重写来发送SessionId
浏览器在访问服务器的某个地址时,会使用一个改写过的地址,
即在原有地址后追加SessionID,这种重新定义URL内容的方式叫做URL重写。
1.生成链接地址和表单提交时,实现URL重写
如:<a href=”<%=response.encodeURL(String url)>”>链接地址</a>
2.如果是重定向,使用如下代码代替response.sendRedirect()
response.encodeRedirectURL(String url);
读取Session中的数据:
1.利用Cookie在客户端浏览器中保存了Session的ID
ID 不是敏感信息, 是随机生成的
2.在用户第一次访问网站时候生成Session ID
3.服务器端为每个Session ID分配了一个缓存集合(Map)
4.每个用户的Session ID 不重复, 每个用户都有属于自己的一个Session缓存(集合)
5.这个Session集合是保存到服务器端的, 可以存储任何敏感信息, 客户端不可见!
6.Session可以通过request对象得到, 其类型为 HttpSession
7.在JSP中session是内置对象 或者 从PageContext中获得.
8.为了避免服务器内存过度消耗, 如果 Session 对象从最后一次访问开始计时超过20分钟没有使用, 则销毁.
session对象的超时销毁时间可以在web.xml中设置.
二.关键要点:
每个用户(浏览器)对应唯一的一个Session对象
Session对象保存在服务器
Session的ID利用Cookie保存在客户端
Session对象超时销毁.
三.比较Cookie与Session
1.Cookie的数据存在客户浏览器端,明码保存
(1)Cookie没有数据安全性,不适合保存敏感数据
(2)一般用于保存文本的ID数据
2.Cookie只能保存文本数据
(1)数据量不能太大,一般不超过4k
(2)其编码是ISO8859-1,存储中文和特殊字符需要编码
3.Session保存在服务器端
(1)客户不能直接看到,Session可以安全保存数据
(2)Session不能持久保存数据,会超时删除的!持久数据应该放在数据库中.
(3)Session中可以存储大量数据,服务器会利用硬盘进行缓存数据
缓存时候是利用对象序列化技术实现!但是会变慢.
4.Session是ID是利用Cookie存储在客户端的!
(1)如果客户端不能存储Session ID,Session 失效
(2)或者删除Session ID 则Session失效
四.JSTL EL 与 Session
在JSP中可以利用 JSTL EL 访问 Session 中的数据
EL 表达式的查找过程:
1.EL 表达式在默认情况下 按照先后次序在 pageContext,request,
session和application空间中查找变量,先找到为准!
(1)返回数据时候调用其方法 xxx.getAttribute(name)
2.如果需要在特定的范围内查找数据请使用内置对象:pageScope,requestScope,
sessionScope,applicationScope
五.浏览器禁用Cookie,则实现URL重写来发送SessionId
浏览器在访问服务器的某个地址时,会使用一个改写过的地址,
即在原有地址后追加SessionID,这种重新定义URL内容的方式叫做URL重写。
1.生成链接地址和表单提交时,实现URL重写
如:<a href=”<%=response.encodeURL(String url)>”>链接地址</a>
2.如果是重定向,使用如下代码代替response.sendRedirect()
response.encodeRedirectURL(String url);
演示Session的创建:
package cn.tedu.tstore.web;
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的创建
*/
public class SessionDemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//第一次获取Session时候,会自动创建Session
HttpSession session = request.getSession();
//Session ID 会自动通过Cookie下发到
//浏览器的Cookie中
String id = session.getId();
System.out.println(id);
double d = Math.random();
//将随机数保存到当前用户的Session中
session.setAttribute("test", d);
System.out.println("test:"+d);
//简单响应
response.setContentType("text/html");
response.getWriter().print("OK");
}
}
读取Session中的数据:
package cn.tedu.tstore.web;
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中的数据
*/
public class ReadSessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取当前用户的Session对象
//getSession()如果没有Session则创建
//Session如果有Session对象,则获取当前Session对象
HttpSession session = request.getSession();
Double d =(Double)session.getAttribute("test");
System.out.println("id:"+session.getId());
System.out.println("test:"+d);
//简单响应
response.setContentType("text/html");
response.getWriter().println(d);
}
}