Session

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值