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,一般在显示购物车的时候使用这个代码。

0 0
原创粉丝点击