什么是会话

什么是会话:当浏览器发请求访问服务器开始,一直到访问服务器结束,浏览器关闭为止,这期间浏览器和服务器之间产生的所有请求和响应加在一起,就称之为浏览器和服务器之间的一次会话。

在一次会话中往往会产生一些数据,而这些数据往往是需要我们保存起来的,如何保存会话中产生的这些数据呢?

  • 比如在购物过程中,将商品加入购物车,其实就是将商品信息保存到数据库中。(不讨论)

  • 如果在没有登录时,将商品加入购物车,其实就是将商品信息保存到了cookie或session中。

可以使用cookie或者session保存会话中产生的数据。

如何将会话中产生的数据保存到cookie或者是session中?

cookie原理及应用

cookie的工作原理

  1. Cookie是将会话中产生的数据保存在客户端,是客户端技术。

  2. Cookie是基于两个头进行工作的:分别是Set-Cookie响应头和Cookie请求头

  3. 通过Set-Cookie响应头将cookie从服务器端发送给浏览器,让浏览器保存到内部;而浏览器一旦保存了cookie,以后浏览器每次访问服务器时,都会通过cookie请求头,将cookie信息再带回服务器中。在需要时,在服务器端可以获取请求中的cookie中的数据,从而实现某些功能。

cookie的API及应用

1、创建Cookie对象

Cookie c = new Cookie(String name, String value);
// 创建cookie的同时需要指定cookie的名字和cookie要保存的值

2、将Cookie添加到response响应中

response.addCookie( Cookie c );
// 将cookie添加到响应中,由服务器负责将cookie信息发送给浏览器,再由浏览器保存到内部(可以多次调用该方法,添加一个以上的cookie)

3、获取请求中的所有cookie对象组成的数组

Cookie[] cs = request.getCookies();
// 获取请求中携带的所有cookie组成的cookie对象数组,如果请求中没有携带任何cookie,调用该方法会返回null。

4、删除浏览器中的Cookie

// cookie的API中没有提供直接删除cookie的方法,可以通过别的方式间接删除cookie
// 删除名称为cart的cookie:可以向浏览器再发送一个同名的cookie(即名称也叫做cart),并设置cookie的最大生存时间为零,由于浏览器是根据cookie的名字来区分cookie,如果前后两次向浏览器发送同名的cookie,后发送的cookie会覆盖之前发送的cookie。而后发送的cookie设置了生存时间为零,因此浏览器收到后也会立即删除!

代码示例:

//创建一个名称为cart的cookie
Cookie c = new Cookie("cart", "");
//设置cookie的最大生存时间为零
c.setMaxAge( 0 );
//将cookie添加到响应中,发送给浏览器
response.addCookie( c );
out.write( "成功删除了名称为cart的cookie..." );

5、Cookie的常用方法

cookie.getName(); // 获取cookie的名字
cookie.getValue(); // 获取cookie中保存的值
cookie.setValue(); // 设置/修改cookie中保存的值(没有setName方法,因为cookie的名字无法修改)
cookie.setMaxAge(); //设置cookie的最大生存时间

6、setMaxAge方法:设置cookie的最大生存时间

如果不设置该方法,cookie默认是会话级别的cookie,即生存时间是一次会话。当浏览器关闭,会话结束时,cookie也会被销毁(cookie默认存在浏览器的内存中,当浏览器关闭,内存释放,cookie也会随着内存的释放而销毁。)
如果设置了该方法,cookie将不会保存到浏览器的内存中,而是以文件形式保存到浏览器的临时文件夹中(也就是硬盘上),这样再关闭浏览器,内存释放,保存到硬盘上的cookie文件不会销毁,再次打开浏览器,还可以获取硬盘上的cookie信息。

代码示例:

//创建一个Cookie对象,将商品信息保存到cookie中
Cookie cookie = new Cookie( "cart", prod  );
//设置cookie的最大生存时间, 单位:秒
cookie.setMaxAge( 60*60*24 );
//将cookie对象添加到response响应中
response.addCookie( cookie );

案例:使用cookie模拟购物车

1.index.html

...
<body>
    <h3>点击下面的商品链接, 可以将商品加入购物车</h3>
    <!-- 
    http://localhost/day13-cookie/CartServlet
    http://localhost/day13-cookie/index.html
     -->
    <p><a href="CartServlet?prod=iphone11">iphone11</a></p>
    <p><a href="CartServlet?prod=vivonex3">vivonex3</a></p>
    <p><a href="CartServlet?prod=xiaomishouji">xiaomishouji</a></p>
    <p><a href="CartServlet?prod=huaweip30">huaweip30</a></p>
    <p><a href="CartServlet?prod=海尔洗衣机">海尔洗衣机</a></p>
    
    <h3>点击下面的支付链接, 可以对购物车中的商品进行结算</h3>
    <a href="PayServlet">支付</a>
</body>
...

2.CartServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    //-------------------------------------------------------
    //获取请求中携带的商品信息(将要加入购物车的商品信息)
    String prod = request.getParameter( "prod" );
    //创建一个Cookie对象,将商品信息保存到cookie中
    Cookie cookie = new Cookie( "cart", prod  );
    //设置cookie的最大生存时间, 单位:秒
    cookie.setMaxAge( 60*60*24 );
    //将cookie对象添加到response响应中
    response.addCookie( cookie );
    //做出回应
    out.write( "成功将"+prod+"加入了购物车....." );
}

3.PayServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    //------------------------------------------------------
    //获取请求中的所有cookie信息(null/cookie数组)
    Cookie[] cs = request.getCookies();
    //遍历所有cookie数组, 找出名称为cart的cookie
    String prod = null;
    if( cs != null ) {
        for (Cookie c : cs) {
            if( "cart".equals( c.getName() ) ) {
                //获取cookie中保存的商品信息
                prod = c.getValue();
            }
        }
    }
    //为商品进行结算
    if( prod == null ) {
        out.write( "您还没有将商品加入购物车...." );
    }else {
        out.write( "成功为"+prod+"支付了1000.00元...." );
    }
}

session原理及应用

session的工作原理

  1. Session是将会话中产生的数据保存在服务器端,是服务器端技术

  2. Session是一个域对象,session中也保存了一个map集合,往session中存数据,其实就是将数据保存到session的map集合中。

  3. 通过session.setAttribute()方法可以将数据保存到session中,通过session.getAttribute()方法可以将数据从session中取出来。

session是一个域对象

获取session对象:

request.getSession() 
// 获取一个session对象;如果在服务器内部有当前浏览器对应的session,则直接返回该session对象;如果没有对应session,则会创建一个新的session对象再返回;

Session是一个域对象,因此session中也提供了存取数据的方法。

session.setAttribute(String attrName, Object attrValue); 
// 往session域中添加一个域属性,属性名只能是字符串类型,属性值可以是任意类型。
session.getAttribute(String attrName);
// 根据属性名获取域中的属性值,返回值是一个Object类型

Session域对象的三大特征:

(1)生命周期:

创建session:第一次调用request.getSession()方法时,会创建一个session对象。(当浏览器在服务器端没有对应的session时,调用request.getSession()方法服务器会创建一个session对象。)

销毁session:

  1. 超时销毁:默认情况下,当超过30分钟没有访问session,session就会超时销毁。(30分钟是默认时间,可以修改,但不推荐修改)

  2. 自杀:调用session的invalidate方法时,会立即销毁session。

  3. 意外身亡:当服务器非正常关闭时(硬件损坏,断电,内存溢出等导致服务器非正常关闭),session会随着服务器的关闭而销毁;

    当服务器正常关闭,在关闭之前,服务器会将内部的session对象序列化保存到服务器的work目录下,变为一个文件。这个过程叫做session的钝化(序列化);再次将服务器启动起来,钝化着的session会再次回到服务器,变为服务器中的对象,这个过程叫做session的活化(反序列化)。

(2)作用范围:在一次会话范围内(获取到的都是同一个session对象)

(3)主要功能:在整个会话范围内实现数据的共享

案例:使用session模拟购物车

1、index.html

<body>
    <h3>点击下面的商品链接, 可以将商品加入购物车</h3>
    <!-- 
    http://localhost/day13-cookie/CartServlet
    http://localhost/day13-cookie/index.html
     -->
    <p><a href="CartServlet?prod=iphone11">iphone11</a></p>
    <p><a href="CartServlet?prod=vivonex3">vivonex3</a></p>
    <p><a href="CartServlet?prod=xiaomishouji">xiaomishouji</a></p>
    <p><a href="CartServlet?prod=huaweip30">huaweip30</a></p>
    <p><a href="CartServlet?prod=海尔洗衣机">海尔洗衣机</a></p>
    
    <h3>点击下面的支付链接, 可以对购物车中的商品进行结算</h3>
    <a href="PayServlet">支付</a>
</body>

2、CartServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    //------------------------------------------------------
    //获取将要添加到购物车的商品信息
    String prod = request.getParameter( "prod" );
    //获取一个session对象,将商品信息保存到session中
    HttpSession session = request.getSession();
    //设置session的超时时间为30秒
    //session.setMaxInactiveInterval( 30 );
    session.setAttribute( "cart" , prod );
    //做出响应
    out.write( "成功将 [ "+prod+" ] 加入了购物车~~~" );
}

3、PayServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    //获取一个session对象(之前的session)
    HttpSession session = request.getSession();
    //从session中获取到要结算的商品信息
    String prod = (String)session.getAttribute( "cart" );
    //对商品进行结算,做出回应
    out.write( "成功为 [ "+prod+" ] 支付了2000.00元~~~~" );
}

总结:两者的区别

Cookie和session都属于会话技术,都可以保存会话中产生的数据,但由于cookie和session的工作原理和特点不同,因此两者的应用场景也不一样。

Cookie的特点:

  1. cookie是将会话中产生的数据保存在浏览器客户端, 是客户端技术(JS可以访问cookie)

  2. cookie是将数据保存在客户端浏览器,容易随着用户的操作导致cookie丢失或者被窃取,因此cookie中保存的数据不太稳定,也不太安全。

  3. 但cookie将数据保存在客户端,对服务器端没有太多影响,可以将数据保存很长时间。

  4. 总结:因此cookie中适合存储需要长时间保存、但对安全性要求不高的数据。

  5. 浏览器对cookie的大小和个数都有限制,一般推荐每一个站点给浏览器发送的cookie数量不超过20个,每一个cookie的大小不超过1kb。

  6. Cookie的应用:实现购物车、记住用户名、30天内自动登录等。

Session的特点

  1. session是将会话中产生的数据保存在服务器端,是服务器端技术

  2. session将数据存在服务器端的session对象中,相对更加的安全,而且更加稳定。不容易随着用户的操作而导致session中的数据丢失或者是被窃取。

  3. 但session是服务器端的对象,在并发量较高时每一个浏览器客户端在服务器端都要对应一个session对象,占用服务器的内存空间,影响效率。

  4. 总结:因此session中适合存储对安全性要求较高,但不需要长时间保存的数据。

  5. Session的应用:保存登录状态、保存验证码

扩展内容

cookie中保存中文数据的问题

以下问题是针对Tomcat8.0及8.0以下的版本,在Tomcat8.5及8.5以后的版本中已经解决了该问题!

HTTP协议中规定了请求信息和响应信息中不能包含中文数据!

因此通过浏览器向服务器发送中文数据时,浏览器会将中文数据进行URL编码,编码为下面这种格式:

http://localhost/day13-cookie/index.html?user=%E5%BC%A0%E9%A3%9E%E9%A3%9E

将中文数据转成下面这种格式,叫做URL编码:

张飞飞 ---> URL编码 ---> %E5%BC%A0%E9%A3%9E%E9%A3%9E

将下面这种格式再次转回中文数据,叫做URL解码:

%E5%BC%A0%E9%A3%9E%E9%A3%9E ---> URL解码---> 张飞飞

问题:当cookie中保存中文数据,将cookie添加到响应中时,会报一个500异常,如下:

解决方法是:

将存入cookie中的先进行URL编码,再存入Cookie中,例如:

从cookie取出来的数据是进行URL编码后的数据,在使用之前需要进行URL解码,例如:

获取不到之前的session的问题

将商品保存到session中后,关闭浏览器再打开浏览器,访问服务器,此时获取不到之前的session。因为session是基于Cookie工作的。

在服务器创建一个session后,会为session分配一个独一无二的编号,称之为session的id,在此次响应时,服务器会将session的id以一个名称为JSESSIONID的cookie发送给浏览器保存到浏览器内部。

由于保存sessionid的cookie默认是会话级别的cookie,在浏览器关闭后,cookie会跟着销毁,sessionid也丢失了。因此下次访问服务器,没有session的id就获取不到之前的session。也获取不到session中的商品信息

解决方法:我们可以创建一个名称为JSESSIONID的cookie,其中保存session的ID,并设置cookie的最大存活时间,让cookie保存到硬盘上(即使浏览器关闭,cookie也不会销毁),这样下次访问服务器时,还可以将sessionid带给服务器,服务器可以通过sessionid获取到之前的session。 从session中获取到商品信息

04-02作业:

1、描述Cookie保存数据的原理

2、描述session保存数据的原理

3、练习课上案例:使用cookie技术实现购物功能

4、练习课上案例:使用session技术实现购物功能

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tedu</groupId>
  <artifactId>day16-cookie</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
</project>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- 
        http://localhost:8080/day16-cookie/CartServlet
        http://localhost:8080/day16-cookie/index.html
     -->
    <h3>点击下面的商品链接,将商品加入购物车.....</h3>
    <p><a href="CartServlet?prod=huaweip40">huaweip40</a></p>
    <p><a href="CartServlet?prod=xiaomi10">xiaomi10</a></p>
    <p><a href="CartServlet?prod=vivos7">vivos7</a></p>
    <p><a href="CartServlet?prod=iphone11">iphone11</a></p>
    
    <h3>点击下面的支付链接,对购物车商品进行支付.....</h3>
    <p><a href="PayServlet">支付</a></p>
</body>
</html>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>day16-cookie</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>CartServlet</display-name>
    <servlet-name>CartServlet</servlet-name>
    <servlet-class>com.tedu.CartServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CartServlet</servlet-name>
    <url-pattern>/CartServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>PayServlet</display-name>
    <servlet-name>PayServlet</servlet-name>
    <servlet-class>com.tedu.PayServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PayServlet</servlet-name>
    <url-pattern>/PayServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>DeleteCookie</display-name>
    <servlet-name>DeleteCookie</servlet-name>
    <servlet-class>com.tedu.DeleteCookie</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DeleteCookie</servlet-name>
    <url-pattern>/DeleteCookie</url-pattern>
  </servlet-mapping>
</web-app>

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 负责将商品加入购物车
 * @author huawei
 *
 */
public class CartServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //--------------------------
        //1.获取请求中的参数(要添加到购物车的商品信息)
        String prod=request.getParameter("prod");
        
        //2.创建一个cookie对象,将商品信息保存到cookie中
        Cookie cookie=new Cookie("cart",prod);
        
        //为cookie设置最大存活时间(秒/单位)
        cookie.setMaxAge(60*60*24*365);//1年
        
        //3.将cookie添加到响应中,发送给浏览器保存
        response.addCookie(cookie);
        out.write("成功将["+prod+"]加入购物车....");

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DeleteCookie extends HttpServlet {
    private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //-----------------------------------
        /**
         * Cookie的API中没有提供直接删除cookie的方法
         * 可以通过setMaxAge(0)间接删除cookie
         * 例如:删除名称为cart的cookie
         * 思路:向浏览器再发送一个同名的(名称为cart的)cookie,并且设置
         * 该cookie的setMaxAge为零,将cookie发送给浏览器,就可以
         * 删除名称为cart的cookie
         * 
         * 原理:由于浏览器是根据cookie的名字来区分一个cookie的,如果
         * 先后两次给浏览器发送同一个名称的cookie,后面发送的cookie则
         * 会覆盖前面发送的cookie.而后发送的cookie设置了生存时间为0,
         * 浏览器收到后,也会立即删除
         */
        Cookie c=new Cookie("cart","");
        c.setMaxAge(0);
        response.addCookie(c);
        out.write("成功删除了名称为cart的cookie!!!!!!");
        
        
    }

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 对购物车中的商品进行结算
 * @author huawei
 *
 */
public class PayServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //-----------------------------
        //1.获取请求中的所有cookie组成的数组
        Cookie[] cs = request.getCookies();//array? null?
        
        //2.遍历cookie数组
        String prod=null;
        if(cs !=null) {
            for (Cookie cookie : cs) {
                //3.找到名称为cart的cookie(判断cookie的名字是否为cart)
                if(cookie.getName().equals("cart")) {
                    //4.将名称为cart的cookie中保存的商品取出来
                    prod=cookie.getValue();
                }
            }
        }
        
        //5.模拟支付,并给出响应
        if(prod==null) {
            out.write("您还没有将商品加入购物车.....");
        }else {
            out.write("成功为["+prod+"]支付了1000元.....");
        }

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tedu</groupId>
  <artifactId>day16-session</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
</project>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- 
        http://localhost:8080/day16-cookie/CartServlet
        http://localhost:8080/day16-cookie/index.html
     -->
    <h3>点击下面的商品链接,将商品加入购物车.....</h3>
    <p><a href="CartServlet?prod=huaweip40">huaweip40</a></p>
    <p><a href="CartServlet?prod=xiaomi10">xiaomi10</a></p>
    <p><a href="CartServlet?prod=vivos7">vivos7</a></p>
    <p><a href="CartServlet?prod=iphone11">iphone11</a></p>
    
    <h3>点击下面的支付链接,对购物车商品进行支付.....</h3>
    <p><a href="PayServlet">支付</a></p>
</body>
</html>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>day16-session</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>CartServlet</display-name>
    <servlet-name>CartServlet</servlet-name>
    <servlet-class>com.tedu.CartServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CartServlet</servlet-name>
    <url-pattern>/CartServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>PayServlet</display-name>
    <servlet-name>PayServlet</servlet-name>
    <servlet-class>com.tedu.PayServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PayServlet</servlet-name>
    <url-pattern>/PayServlet</url-pattern>
  </servlet-mapping>
</web-app>

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 负责将商品加入购物车
 * @author huawei
 *
 */
public class CartServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //----------------------------
        //1.获取请求中的参数(要添加到购物车的商品信息)
        String prod=request.getParameter("prod");
        
        /**
         * 2.获取一个session对象,将商品添加到session中
         * 如果服务器内部有当前浏览器对应的session,就会直接返回该session;
         * 如果服务器内部没有对应的session,就会创建一个session再返回
         */
        HttpSession session = request.getSession();
        session.setAttribute("cart", prod);
        
        //3.做出响应
        out.write("成功将["+prod+"]加入了购物车~~~~~~");
    }

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 对购物车的商品进行结算
 * @author huawei
 *
 */
public class PayServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //--------------------------------------
    
        /**
         * 1.获取之前的session
         * request.getSession(false)
         * 如果服务器内部有当前浏览器对应的seeeion,就返回该session对象
         * 如果服务器内部没有当前浏览器对应的session,就返回null值
         */
        HttpSession session = request.getSession(false);//session对象?null
        
        //2.从session中取出添加的商品信息
        if(session==null) {
            out.write("您还没有将商品加入购物车~~~~~");
        }else {
            //3.模拟支付并作出回应
            String prod = (String)session.getAttribute("cart");
            out.write("成功为["+prod+"]支付了2000元~~~~~");
        }

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

unit10-Cookie、Session相关推荐

  1. 还分不清 Cookie、Session、Token、JWT?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:掘金   作者:秋天不落叶 juejin.im/po ...

  2. python自动化接口测试中的cookies怎么实现_Python接口自动化之cookie、session应用

    ------·今天距2021年260天·------ 这是ITester软件测试小栈第112次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化-requests模块之post请 ...

  3. Cookie、Session、Token那点事儿

    前言:新公司项目中使用到了Cookie,在各大Android技术讨论群向前辈们取经讨论这cookie.session.token这仨哥们的时候,很多开发者说法不一各抒已见,所以是时候回顾下http基础 ...

  4. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息 ...

  5. chrome session丢失_一文带你彻底读懂Cookie、Session、Token到底是什么

    在了解这三个概念之前我们先要了解HTTP是无状态的Web服务器,什么是无状态呢?就像上面夏洛特烦恼中经典的一幕对话一样,一次对话完成后下一次对话完全不知道上一次对话发生了什么.如果在Web服务器中只是 ...

  6. 面试官:要不讲讲 Cookie、Session、Token、JWT之间的区别?

    击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入组织 来源:22j.co/btPm 什么是认证(Authentication ...

  7. 购物车的实现(cookie、session)

    购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已.用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品就自动保存到你的购物车中,重复选购后,最后将选中的 ...

  8. vue从url中获取token并加入到 请求头里_BATJ都会用到的接口鉴权cookie、session 和token...

    鉴权 鉴权是指验证用户是否拥有访问系统的权利-鉴定权限. cookie.session和token 为什么会有cookie.session和token? 1. http是无状态协议 什么是无状态呢? ...

  9. cookie、session、sessionid 与jsessionid

    转载自  cookie.session.sessionid 与jsessionid cookie.session.sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场 ...

  10. php session 机制,Cookie、Session机制详解及PHP中Session处理

    会话机制 Cookie/Session: 在web应用中,常用的会话追踪机制是Cookie和Session.而Cookie是通过在浏览器里记录确定用户身份,Session在服务器端记录信息确定用户身份 ...

最新文章

  1. flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...
  2. 游戏行业中的职位:你可以做什么
  3. 异常信息: java.lang.ClassNotFoundException: org.aspec
  4. python最基本的规则是关键字吗,Python 关键字
  5. php redis mset,MSET命令_视频讲解_用法示例-redis编程词典-php中文网
  6. springboot使用mongodb
  7. 全网最细Docker安装Minio,填满最新版大坑(强烈推荐收藏)
  8. arcgis10.1连接sqlserver数据库常见问题(转载)
  9. 云计算入门科普系列:基于Docker部署LNMP架构
  10. 热敏电阻如何查表计算温度_额温枪温补算法:热电堆温度补偿算法 MTP10B7F55
  11. 读书记录(持续更新...)
  12. Quartz 配置详解
  13. 计算机本地配置文件丢失,电脑C盘文件丢失的常见原因及恢复方法
  14. 微信小程序中如何使用阿里云iconfont图标
  15. 史上最全Java学习资料,共14W字,耗时半年整理
  16. Springboot项目调用阿里云语音服务案例【真实有用】
  17. ArcGis 地理配准注意事项
  18. blos硬盘启动台式计算机,戴尔台式机bios设置硬盘启动教程
  19. win7下桌面IE快捷方式无法删除解决方法
  20. python函数快查快用

热门文章

  1. Dva引用echarts制作统计图表
  2. §6.5 分离性公理与子空间,(有限)积空间和商空间
  3. 【问题解决】QT报错 undefined reference to `__imp__ZN11QSerialPortD1Ev‘
  4. OpwnWrt 路由器MWAN3多线多拨实现方法
  5. Java通用数据访问层 Uncode-DAL
  6. 字节跳动实习生转正工资_日常实习 | 字节跳动西瓜视频招募运营实习生啦!
  7. 【字节跳动实习】后端日常实习的三次面试+hr面 面经
  8. 阿里云国际版账号登录不上去,账号被风控怎么办?
  9. 咖世家咖啡与瑞士莲首度跨界合作,打造联名快闪店
  10. 【合天网安】利用sqlmap辅助手工注入