二, Session 和 Cookie 的主要区别
Cookie 是把用户的数据写给用户的浏览器.
Session 技术把用户的数据写到用户独占的 session 中.
Session 对象由服务器创建, 开发人员可以调用 request 对象的 getSession 方法得到 session 对象.
cookie 数据存放在客户的浏览器上, session 数据放在服务器上
cookie 不是很安全, 别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗考虑到安全应当使用 session.
三, session 实现原理
服务器是如何实现一个 session 为一个用户浏览器服务的?
服务器创建 session 出来后, 会把 session 的 id 号, 以 cookie 的形式回写给客户机, 这样, 只要客户机的浏览器不关, 再去访问服务器时, 都会带着 session 的 id 号去, 服务器发现客户机浏览器带 session id 过来了, 就会使用内存中与之对应的 session 为之服务. 可以用如下的代码证明:
- package xdp.gacl.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;
- public class SessionDemo1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setCharacterEncoding("UTF=8");
- response.setContentType("text/html;charset=UTF-8");
- // 使用 request 对象的 getSession() 方法获取 session, 如果 session 不存在则创建一个
- HttpSession session = request.getSession();
- // 将数据存储到 session 中
- session.setAttribute("data", "大花猫");
- // 获取 session 的 Id
- String sessionId = session.getId();
- // 判断 session 是不是新创建的
- if (session.isNew()) {
- response.getWriter().print("session 创建成功, session 的 id 是:"+sessionId);
- }else {
- response.getWriter().print("服务器已经存在该 session 了, session 的 id 是:"+sessionId);
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
结果可以自己试一下自己体会
session 对象的一些常用方法:
1,public void setAttribute(String name,String value) 设定指定名字的属性的值, 并将它添加到 session 会话范围内, 如果这个属性是会话范围内存在, 则更改该属性的值.
/*
setAttribute("给这个变量取的名字, 以后通过这个名字 getAttribute, 比如 hello", 变量);
getAttribute("hello") 就得到变量了
变量可以是任意的类型, 比如 String,int, 或自己定义的类对象, 所以 get 的时候就涉及到类型转换的问题了
这时强转一下就行了, 如果 set 的时候放的是 String 类型的变量, 则 String s=(String)session.getAttribute("hello");
*/
2,public Object getAttribute(String name) 在会话范围内获取指定名字的属性的值, 返回值类型为 object, 如果该属性不存在, 则返回 null.
3,public void removeAttribute(String name), 删除指定名字的 session 属性, 若该属性不存在, 则出现异常.
4,public void invalidate(), 使 session 失效. 可以立即使当前会话失效, 原来会话中存储的所有对象都不能再被访问.
5,public String getId( ), 获取当前的会话 ID. 每个会话在服务器端都存在一个唯一的标示 sessionID,session 对象发送到浏览器的唯一数据就是 sessionID, 它一般存储在 cookie 中.
6,public void setMaxInactiveInterval(int interval) 设置会话的最大持续时间, 单位是秒, 负数表明会话永不失效.
7. public int getMaxInActiveInterval(), 获取会话的最大持续时间, 使用时候需要一些处理
来源: http://www.bubuko.com/infodetail-2643148.html