不同点 | Cookie | Session |
---|---|---|
存储位置不同 | Cookie 将数据存放在客户端浏览器内存中或硬盘上。 | Session 将数据存储在服务器端。 |
大小和数量限制不同 | 浏览器对 Cookie 的大小和数量有限制。 | Session 的大小和数量一般不受限制。 |
存放数据类型不同 | Cookie 中保存的是字符串。 | Session 中保存的是对象。 |
安全性不同 | Cookie 明文传递,安全性低,他人可以分析存放在本地的 Cookie 并进行 Cookie 欺骗。 | Session 存在服务器端,安全性较高。 |
对服务器造成的压力不同 | Cookie 保存在客户端,不占用服务器资源。 | Session 保存在服务端,每一个用户独占一个 Session。若并发访问的用户十分多,就会占用大量服务端资源。 |
跨域支持上不同 | Cookie 支持跨域名访问。 | Session 不支持跨域名访问。 |
//获取session对象 HttpSession session=request.getSession();
返回值类型 | 方法 | 描述 |
---|---|---|
long | getCreationTime() | 返回创建 Session 的时间。 |
String | getId() | 返回获取 Seesion 的唯一的 ID。 |
long | getLastAccessedTime() | 返回客户端上一次发送与此 Session 关联的请求的时间。 |
int | getMaxInactiveInterval() | 返回在无任何操作的情况下,Session 失效的时间,以秒为单位。 |
ServletContext | getServletContext() | 返回 Session 所属的 ServletContext 对象。 |
void | invalidate() | 使 Session 失效。 |
void | setMaxInactiveInterval(int interval) | 指定在无任何操作的情况下,Session 失效的时间,以秒为单位。负数表示 Session 永远不会失效。 |
<?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>10</session-timeout> </session-config> </web-app>
//设置会话的过期时间 request.getSession().setMaxInactiveInterval(100);
返回值类型 | 方法 | 描述 |
---|---|---|
void | setAttribute(String name, Object o) |
把一个 Java 对象与一个属性名绑定,并将它作为一个属性存放到 Session 对象中。 参数 name 为属性名,参数 object 为属性值。 |
Object | getAttribute(String name) | 根据指定的属性名 name,返回 Session 对象中对应的属性值。 |
void | removeAttribute(String name) | 从 Session 对象中移除属性名为 name 的属性。 |
Enumeration | getAttributeNames() | 用于返回 Session 对象中的所有属性名的枚举集合。 |
不同 | request | Session | ServletContext |
---|---|---|---|
类型 | javax.servlet.http.HttpServletRequest | javax.servlet.http.HttpSession | javax.servlet.ServletContext |
创建 | 客户端向容器发送请求时创建。 | 容器第一次调用 getSession() 方法时创建。 | Servlet 容器启动时创建。 |
销毁 | 容器对这次请求做出响应后销毁。 |
Session 销毁的时机:
|
容器关闭或者 Web 应用被移除时销毁。 |
有效范围 | 只对当前请求涉及的 Servlet 有效。 | Session 对本次会话期间的所有 Servlet 都有效。 | 对整个 Web 应用内的所有 Servlet 有效。 |
数量 | Web 应用中的所有 Servlet 实例都可以有多个 request 对象。 | Web 应用中可以有多个 Session,多个 Servet 实例可以共享同一 Session 对象。 | 在整个 Web 应用中只有一个 Context 对象。 |
数据共享 |
每一次请求都是一个新的 request 对象。 通过和请求转发的配合使用可以实现一次请求中 Web 组件之间共享的数据。 |
每一次会话都是一个新的 Session 对象。 通过 Session 域对象可以实现一次会话中的多个请求之间共享数据。 |
在一个应用中有且只有一个 Context 对象,作用于整个 Web 应用,可以实现多次会话之间的数据共享。 |
package net.lmcjl.com.session; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; /** * 记录上次的访问时间 * * @author 编程帮 www.lmcjl.com */ @WebServlet("/LoginTimeSessionServlet") public class LoginTimeSessionServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置页面输出的格式 response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); writer.write("<h1>编程帮 www.lmcjl.com</h1>" + "<h3>编程帮,程序员的好帮手,欢迎您的到来!</h3>"); // 记录当前的时间 Date date = new Date(); //时间的格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //会话创建时间 Date CreationTime = new Date(request.getSession().getCreationTime()); //会话上次关联的时间 Date LastAccessedTime = new Date(request.getSession().getLastAccessedTime()); //格式化 String sDate = sdf.format(date); //将当前时间赋值到session域对象中 request.getSession().setAttribute("lastTime", sDate); //设置会话的失效时间 request.getSession().setMaxInactiveInterval(100); //对session中各个信息输出到页面 writer.write("<h3>当前时间:" + sDate + "</h3>" + "当前会话的SessionID: " + request.getSession().getId() + "<br/>" + "创建此会话的时间为:" + sdf.format(CreationTime) + "<br/>" + "Sesssion上次关联的时间为:" + sdf.format(LastAccessedTime) + "<br/>" + "话保持打开状态的最大时间间隔:" + request.getSession().getMaxInactiveInterval() + "<br/>" ); //浏览器不支持COOKIE String url = response.encodeURL("/sessionDemo/SencodTimeServlet"); writer.write("<a href=" + url + ">再次访问</a>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package net.lmcjl.com.session; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; /** * @author 编程帮 www.lmcjl.com */ @WebServlet("/SencodTimeServlet") public class SencodTimeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); //从session中获取上次访问的时间 String value = (String) request.getSession().getAttribute("lastTime"); //不是第一次访问 writer.write("<h1>编程帮 www.lmcjl.com</h1>" + "<h3>编程帮,程序员的好帮手,欢迎您的归来</h3><h3>您上次的时间是" + value + "</h3>"); Date date = new Date(); //时间的格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化 String sDate = sdf.format(date); //将当前时间赋值到session域对象中 request.getSession().setAttribute("lastTime", sDate); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
本文链接:http://task.lmcjl.com/news/13523.html