[TOC]
  1. 会话技术

    1. Cookie
    2. Session
  2. JSP:入门学习

会话技术

  1. 会话:一次会话中包含多次请求和响应。

    • 一次会话:浏览器第一次给服务器资源发送请求,会发建立,直到一方断开为止。
  2. 功能:在一次会话的范围内的多次请求间, 共享数据

  3. 方式:

    1. 客户端会话技术:Cookie
    2. 服务器端会话技术:Session

Cookie:

  1. 概念:客户端会话技术,将数据保存到客户端

  2. 快速入门:

    • 使用步骤:

      1. 创建Cookie对象,绑定数据

        • new Cookie(String name,String value)
      2. 发送Cookie对象

        • response.addCookie(Cookie cookie)
      3. 获取Cookie对象,拿到数据

        • Cookie[] request.getCookies() ```java package com.jie.cookie;

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 java.io.IOException;

@WebServlet(“/cookieDemo1”) public class CookieDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //1.创建cookie对象
    Cookie c = new Cookie("msg","hello");

    //2.发送Cookie
    response.addCookie(c);
}

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

}

```java
package com.jie.cookie;

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 java.io.IOException;

@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //3.获取cookie
        Cookie[] cookies = request.getCookies();

        //4.获取数据
        if (cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();

                System.out.println(name+":"+value);
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  1. 实现原理

  2. cookie的细节

    1. 一次可不可以发送多个cookie?

      • 阔以
      • 可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可。
    2. cookie在浏览器中保存多长时间?

      1. 默认情况下,当浏览器关闭后,Cookie数据被销毁。

      2. 设置Cookie的生命周期,持久化存储:

        • setMaxAge(int seconds)

          1. 正数:持久化将Cookie数据写到硬盘的文件中。持久化存储。cookie存活时间。
          2. 负数:默认值。
          3. 零:删除Cookie信息。 ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.创建cookie对象 Cookie c = new Cookie(“msg”,”setMaxAge”);

    //2.设置cookie的存活时间
    c.setMaxAge(30);//将cookie持久化到硬盘,存活30s
    c.setMaxAge(-1);//默认值,浏览器一关,cookie数据就删除
    c.setMaxAge(0);//0,直接删除cookie信息

    //3.发送Cookie
    response.addCookie(c);
}

   3. 
cookie能不能存中文?

      - 在tomcat8之前,不能直接存储中文数据。

         - 需要将中文数据转码。一般采用url编码(%E3)。
      - 在tomcat8之后,可以直接存储中文数据。特殊字符不支持,
   4. 
cookie共享问题?

      1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?

         - 默认情况下,不能共享。
         - `setPath(String path)`:设置Cookie的获取范围。默认情况下,设置当前项目的虚拟目录。

            - 如果要共享,可以将path设置为`/
      2. 不同tomcat服务器间cookie共享问题?

         - `setDomain(String path)`:如果设置一级域名相同,那么多个服务器之间cookie可以共享

            - `setDoamin(".baidu.com"),那么tieba.baidu.com 和news.baidu.com中cookie可以共享`
5. 
Cookie的特点和作用

   1. 
cookie存储数据在客户端浏览器,不是很安全

   2. 
浏览器对于单个cookie的大小有限制 (4kb) 以及  对同一个域名下的总cookie数量也有限制

   - 作用:

      1. cookie一般用于存储少量不太敏感的数据
      2. 在不登录的情况下,完成一个服务器对客户端的身份识别
6. 
案例:记住上一次访问时间

   1. 
需求:

      1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
      2. 如果不是第一次访问,则提示:欢迎回来,您上次的访问时间为:显示时间字符串
   2. 
分析:

      1. 可以采用cookie完成
      2. 在服务器中的Servlet中判断是否有一个名为lastTime的cookie

         1. 有:不是第一次访问

            1. 响应 数据:欢迎回来,您上次访问时间为xxx
            2. 写回Cookie:lastTime=xxxx
         2. 没有:是第一次访问

            1. 响应 数据:您好,欢迎您首次访问
            2. 写回Cookie:lastTime=xxxx

<a name="568878bd"></a>
## JSP:入门学习

1. 
概念:

   - `Java Servlet Pages`:java服务器端页面

      - 可以理解为:一个特殊的页面,其中既可以定义html标签
      - 用于简化书写!!!
2. 
原理

   - JSP本质上就是一个Servlet

3. 
JSP的脚本:JSP定义java代码的方式

   1. `<% 代码 %>`:定义的java代码在service方法中。service可以定义什么 ,该脚本中就可以定义什么
   2. `<%! 代码 %>`:定义的java代码在jsp转换后的java类后,类的成员位置,可以定义成员方法和成员变量
   3. `<%= 代码 %>`:定义的java代码会输出到页面上。输出语句可以定义什么,该脚本就可以定义什么。
4. 
JSP的内置对象

   - 在jsp页面不需要创建和获取,可以直接使用的对象
   - jsp一共有9个内置对象。
   - 三个基本的:

      - `request`
      - `response`
      - `out`:字符输出流对象。可以将数据输出到页面上。和`response.getWriter()类似`

         - `response.getWriter() 和 out的区别`:在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再去找out缓冲区数据。`response.getWriter()`永远在`out`之前。

<a name="8fa491c6"></a>
## Session:

1. 
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。`HttpSession`

2. 
快速入门:

   1. 获取`HttpSession对象`:

      1. `Object getAttribute(String name)`
   2. 使用Session对象

      1. `void setAttribute(String name,Object obj)`
      2. `void removeAttribute(String name)`
3. 
原理

   - Session的实现是依赖于Cookie的

4. 
原理:

   1. 
当客户端关闭后,服务器端不关闭,两次获取的session是否是同一个?

      - 默认情况下,不是。
      - 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
   2. 
客户端不关闭,服务器端关闭后,两次获取的session是否是同一个?

      - 
不是同一个,但是要确保数据不丢失

         - 
session的钝化:

            - 在服务器正常关闭之前,将session对象系列化的到硬盘上
         - 
session的活化:

            - 在服务器启动后,将session文件转化为内存中的session对象即可
   3. 
session什么时候被销毁?

      1. 
服务器关闭

         1. 
session对象调用一个方法`invalidate()`。

         2. 
session默认的实效时间是30分钟。

            - 
选择性修改tomcat中conf中web.xml:
```xml
 <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
  1. session特点

    1. session用于存储一次会话的多次请求的数据,存在服务器端
    2. session可以存储任意类型,任意大小的数据
    • session 与 cookie的区别:

      1. session存储数据在服务器端,Cookie在客户端
      2. session没有数据大小限制,Cookie有
      3. session数据安全,Cookie相对于不安全

案例:验证码

  1. 案例需求

    1. 访问带有验证码的登录界面login.jsp
    2. 用户输入用户名,密码以及验证码

      • 如果用户名和密码输入有误,跳转登录界面,提示:用户名或密码错误
      • 如果验证码输入有误,跳转登录界面,提示,验证码错误
      • 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
  2. 分析

  1. 代码实现:

    1. javaBean ```java package com.jie.domain;

/**

  • 用户的实体类 */ public class User {

    private int id; private String username; private String password;

    public User(int id, String username, String password) {

     this.id = id;
     this.username = username;
     this.password = password;
    

    }

    public User() { }

    public int getId() {

     return id;
    

    }

    public void setId(int id) {

     this.id = id;
    

    }

    public String getUsername() {

     return username;
    

    }

    public void setUsername(String username) {

     this.username = username;
    

    }

    public String getPassword() {

     return password;
    

    }

    public void setPassword(String password) {

     this.password = password;
    

    }

    @Override public String toString() {

     return "User{" +
             "id=" + id +
             ", username='" + username + '\'' +
             ", password='" + password + '\'' +
             '}';
    

    } } ```

  1. checkCodeServlet ```java package com.jie.servlet;

import javax.imageio.ImageIO; 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 java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;

@WebServlet(“/checkCodeServlet”) public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    int widih = 100;
    int height = 50;

    //1.创建一个对象,在内存中图片(验证码图片对象)
    BufferedImage image = new BufferedImage(widih,height,BufferedImage.TYPE_3BYTE_BGR);

    //2.美化图片
    //2.1填充背景色
    Graphics g = image.getGraphics();//画笔对象
    g.setColor(Color.pink);//设置画笔颜色
    g.fillRect(0,0,widih,height);

    //2.2画边框
    g.setColor(Color.blue);
    g.drawRect(0,0,widih-1,height-1);


    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    //生成随机角标
    Random r = new Random();

    StringBuilder sb = new StringBuilder();
    for (int i1 = 1; i1 <= 4; i1++) {
        int i = r.nextInt(str.length());
        //获取字符
        char c = str.charAt(i);//随机字符
        sb.append(c);

        //2.3写验证码
        g.drawString(c+"",widih/5*i1,height/2   );
    }
    String check_session = sb.toString();
    //将验证码存入session
    request.getSession().setAttribute("checkCode_session",check_session);
    //2.4画干扰线
    g.setColor(Color.green);

    //2.5生成随机坐标点

    for (int i = 0; i < 7; i++) {
        int x1 = r.nextInt(widih);
        int x2 = r.nextInt(widih);

        int y1 = r.nextInt(height);
        int y2 = r.nextInt(height);

        g.drawLine(x1,y1,x2,y2);
    }



    //3.将图片输出到页面展示
    ImageIO.write(image, "jpg", response.getOutputStream());
}

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

}



   3. 
LoginServlet
```java
package com.jie.servlet;

import javax.imageio.ImageIO;
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 java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        int widih = 100;
        int height = 50;

        //1.创建一个对象,在内存中图片(验证码图片对象)
        BufferedImage image = new BufferedImage(widih,height,BufferedImage.TYPE_3BYTE_BGR);

        //2.美化图片
        //2.1填充背景色
        Graphics g = image.getGraphics();//画笔对象
        g.setColor(Color.pink);//设置画笔颜色
        g.fillRect(0,0,widih,height);

        //2.2画边框
        g.setColor(Color.blue);
        g.drawRect(0,0,widih-1,height-1);


        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        //生成随机角标
        Random r = new Random();

        StringBuilder sb = new StringBuilder();
        for (int i1 = 1; i1 <= 4; i1++) {
            int i = r.nextInt(str.length());
            //获取字符
            char c = str.charAt(i);//随机字符
            sb.append(c);

            //2.3写验证码
            g.drawString(c+"",widih/5*i1,height/2   );
        }
        String check_session = sb.toString();
        //将验证码存入session
        request.getSession().setAttribute("checkCode_session",check_session);
        //2.4画干扰线
        g.setColor(Color.green);

        //2.5生成随机坐标点

        for (int i = 0; i < 7; i++) {
            int x1 = r.nextInt(widih);
            int x2 = r.nextInt(widih);

            int y1 = r.nextInt(height);
            int y2 = r.nextInt(height);

            g.drawLine(x1,y1,x2,y2);
        }



        //3.将图片输出到页面展示
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
  1. login.JSP ```jsp <%— Created by IntelliJ IDEA. User: Jay Date: 2020/10/31 Time: 15:16 To change this template use File | Settings | File Templates. —%> <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>