会话技术Cookie和Session以及Servlet的域对象总结

会话技术Cookie和Session以及Servlet的域对象总结

概念:

  • 1.可以简单的理解为用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭·浏览器,整个过程称为一次会话。
  • 2.会话的优势:每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。

原理

  • 1.Cookie技术:Cookie是客户端技术,程序把每个用户的数据以Cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样web资源处理的就是用户各自的数据了。
  • 2.Session技术:Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session 中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。

Cookie会话技术

  • 1.代码演示:记录浏览器上一次访问服务端的时间
package com.ser;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取从浏览器带过来的Cookie
        Cookie[] cookies = req.getCookies();
        //遍历浏览器带过来的Cookie
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            if ((cookies!=null)&&(cookie.getName().equals("lasttime"))) {
                String value = cookie.getValue();
                long l = Long.parseLong(value);
                Date date = new Date(l);
                resp.setContentType("text/html;charset=utf-8");
                resp.getWriter().println("你上一次访问时间为:" + date.toLocaleString());
                break;
            } else {
                resp.setContentType("text/html;charset=utf-8");
                resp.getWriter().println("这是第一次访问本网站");
            }
        }
        //创建Cookie就数据存入其中
        Cookie cookie = new Cookie("lasttime",System.currentTimeMillis()+"");
         //给Cookie设置有效路径
        cookie.setPath("/web03_war_exploded");
        //给Cookie设置有效时长,不设置的话cookie默认只存在一次会话
        //如果想使cookie失效cookie.setMaxAge();设置为零就可以
        cookie.setMaxAge(60*60);//设置为一个小时
        //将Cookie回写发送到浏览器
        resp.addCookie(cookie);

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);

    }
}
  • web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app 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_3_0.xsd"
         version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>hello9</servlet-name>
    <servlet-class>com.ser.CookieServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello9</servlet-name>
    <url-pattern>/do9</url-pattern>
  </servlet-mapping>
</web-app> 

Cookie的分类

  • 1.默认级别的Cookie:指的是没有设置有效时间的Cookie, 默认的情况下只要关闭了浏览器,cookie 也会被销毁。( cookie存在于浏览器的内存中,当关闭了浏览器cookie 就销毁了)。
  • 2.持久级别的Cookie:指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,而是将cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。
  • 3.设置Cookie有效时间的方法上述代码已经演示。

Cookie使用注意事项

  • 1.一个 Cookie 只能标识一种信息,至少含有一个标识该信息的名称和值。
  • 2.一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的cookie。
  • 3.浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。总结:浏览器存放的Cookie的大小和个数是有限制的。
  • 4.如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie 。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调setMaxAge(int maxAge)方法,以秒为单位的。
  • 5.需要手动删除持久性cookie,可以将cookie 的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。

Session会话技术(重点)

1.概念:
  • Session称为是一次会话,cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到 session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。
2.Cookie和Session比较
  • 1.Cookie局限性:Cookie保存的数据是有个数和大小的限制的。数据是保存客户端浏览器上〈相对不是很安全)。
  • 2.Session优势:Session没有个数和大小限制,数据是保存在服务器上(相对比较安全)。
3.Session的创建
  • Session对象由服务器创建,开发人员可以调用request对象的getsession方法得到 session对象。
4.Session的代码演示以及方法说明
package com.ser;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session
        HttpSession session = req.getSession();
        //给Session中存东西
        session.setAttribute("name","文奇");
        //获取Session的ID
        String sessionId = session.getId();
        //判断Session是不是新创建的
        if (session.isNew()){
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("session创建成功,sessionId为:"+sessionId);
        }else {
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("session已经在服务器中存在了,sessionId为:"+sessionId);
        }

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
package com.ser;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session
        HttpSession session = req.getSession();
        //获取Session中存东西
        Object name = session.getAttribute("name");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("session中的值为:"+name);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
package com.ser;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session
        HttpSession session = req.getSession();
        //移除session中存东西
        session.removeAttribute("name");
        //手动注销Session
        session.invalidate();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
  • 设置session的有效时间
<!--设置session的有效时间为15分钟,15分钟后自动注销-->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Servlet的域对象总结

1.请求范围(ServletRequest)

  • 1.创建和销毁

    • 创建:当用户向服务器发送一次请求,服务器创建一个request对象。
    • 销毁:当服务器对这次请求作出响应,服务器就会销毁这个request对象。
  • 2.如何存取数据

    • 存数据:setAttribute
    • 取数据:getAttribute
  • 3.作用范围

    • 范围:一次请求。(转发就是一次请求)。

1.会话范围(HttpSession)

  • 1.创建和销毁

    • 创建:服务器端第一次调用getSession方法的时候。
    • 销毁:三种情况。
      • Session过期,默认过期时间为30分钟。
      • 非正常关闭服务器。(正常关闭服务器Session会被序列化)
      • 手动调用session.invalidate();
  • 2.如何存取数据

    • 存数据:setAttribute
    • 取数据:getAttribute
  • 3.作用范围

    • 范围:一次会话(多次请求)。

1.应用范围(ServletContext)

  • 1.创建和销毁

    • 创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。。
    • 销毁:服务器关闭的时候,或者项目从服务器中移除的时候。
  • 2.如何存取数据

    • 存数据:setAttribute
    • 取数据:getAttribute
  • 3.作用范围

    • 范围:整个web应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值