Session
来源:互联网 发布:ps大小尺寸怎么调整mac 编辑:程序博客网 时间:2024/04/29 00:45
web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。一个session只为一个会话服务,只为一个浏览器服务。所以,即使代码相同,但不同浏览器得到的是各自的数据,创建的是各自不同的session。
session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session和cookie的区别:
cookie是把用户的数据写给用户的浏览器(写在浏览器)。
session技术把用户的数据写到用户独占的session中(写在服务器)。
session实现原理(一个session只为一个用户浏览器服务):
浏览器a访问servlet1,若服务器未为浏览器a创建session,则调用getSession方法为浏览器a创建一个session,每个session创建后都有一个id号,服务器将session的id号以cookie的形式回写给浏览器,下次浏览器访问服务器时就会带着这个id号,来告诉服务器需要使用的session。(session是基于cookie的);
一个新的浏览器b去访问服务器,因为没有id号,表明服务器没有为浏览器b创建过session,那么服务器就会为它创建一个session,将session的id号以cookie形式写回浏览器b。
但是,在其中有一个问题,服务器将session的id号以cookie的形式回写给浏览器,而cookie是没有设置有效期的,即浏览器关闭后,cookie就没有了,意味着浏览器下次访问服务器,服务器就会创建一个新的session,没有保存之前的数据。那么我们就要为cookie设置一个有效期:
例:
创建一个1.html:
<!DOCTYPE html><html> <head> <title>1.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <a href="/day07/SessionDemo1">购买</a> <a href="/day07/SessionDemo2">结账</a> </body></html>
创建一个servlet:SessionDemo1(购买servlet)
package cn.sun.session;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;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;//购买Servlet@WebServlet("/SessionDemo1")public class SessionDemo1 extends HttpServlet { private static final long serialVersionUID = 1L; public SessionDemo1() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); //得到用户的session //为cookie设置有效期 String sessionid=session.getId(); //得到session的ID Cookie cookie=new Cookie("JSESSIONID",sessionid); //回写一个与服务器回写的cookie同名的cookie,将其覆盖(就是覆盖服务器回写的cookie)。注:服务器回写的session的名称叫JSESSIONID cookie.setPath("/day07"); //设置相同的path将其覆盖 cookie.setMaxAge(30*60); //设置有效期为30分钟 response.addCookie(cookie); //回写session session.setAttribute("name", "洗衣机"); //存储用户购买的物品 } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}
创建一个servlet:SessionDemo2(结账servlet)
package cn.sun.session;import java.io.IOException;import java.io.PrintWriter;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 javax.servlet.http.HttpSession;//结账servlet@WebServlet("/SessionDemo2")public class SessionDemo2 extends HttpServlet { private static final long serialVersionUID = 1L; public SessionDemo2() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); HttpSession session = request.getSession(); //得到来访者的session String product = (String) session.getAttribute("name"); //得到用户购买的产品 out.write("您购买的商品是:"+product); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}
运行:
点击购买,再返回该界面,然后点击结账:
现在关闭浏览器,重新打开一个新的浏览器,来看看是否改变了cookie的有效期:
直接点击结账:
关闭浏览器后,服务器没有重新创建session对象,说明以cookie形式写回的id仍然存在。
session对象的生命周期:
session的创建:是第一次去执行getSession这个代码时,服务器才会创建一个session。
session的消亡:默认30分钟内未使用session,服务器就会自动摧毁这个session(session对象由服务器管理)。
控制session摧毁的时间:
1、在web.xml中配置:这里以分钟为单位,表示10分钟内未使用session,则摧毁
<session-config> <session-timeout>10</session-timeout> </session-config>
2、在代码中摧毁session:如在上例代码中添加下面这句代码,就表示摧毁一个session
session.invalidate();
引申:
request.getSession(boolean create)这个重载方法,表示是否创建session:
例:request.getSession(false):不创建session,只获取session,一般在显示购物车的时候使用这个代码。
- Session
- session
- Session
- session
- session
- Session
- Session
- SESSION
- session
- session
- Session
- session
- session--
- session
- session
- session
- session
- session
- 遗传算法
- 感兴趣区域ROI
- c语言小项目----注释转换
- 进程切换
- python爬虫模块安装
- Session
- 【OpenCV_03】图像载入,显示和输出 Read & Display Image
- Object-C 之 字符串
- java I/O 学习笔记
- 顺序表——链接表示
- 坑爹的 GB18030
- 关于iTunes中的链接(https://itunes.apple.com/cn/app/xxx/idxxxxxxxxxx?mt=8)中 mt=8的含义
- 9、Git远程协作的主要命令
- 数据结构 --- 数组