热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

day25会话技术_cookie&session&jsp

教学目标能够说出会话的概念能够创建、发送、接收、删除cookie**能够创建、发送、接收、删除cookie**能够完成记录用户各自的上次访问时间案例能够获取session对象、添加

教学目标


  • 能够创建、发送、接收、删除COOKIE


  • 能够获取session对象、添加、删除、获取session中的数据





第一章-会话的概念

知识点-会话的概念


1. 目标





2. 路径



  1. 会话的概念

  2. 为什么要使用会话技术

  3. 常用的会话技术


3. 讲解


3.1会话的概念

​ 用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求). 如同打电话.

​ 我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术保存用户各自的数据

image-20210527094840465


3.2为什么要使用会话技术

​ 保存一次通话过程中的数据!

​ 会话技术中数据的保存方式:

​ 浏览器存储会话数据:COOKIE

​ 服务器存储会话数据:session


3.3常用的会话技术


3.3.1COOKIE(记住用户名密码)

COOKIE是客户端(浏览器)的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把COOKIE带到服务端,服务端就可以做响应的处理。


3.3.2session(记住登录用户名 购物车)

session是服务器端的技术服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到COOKIE中,再次访问的时候,浏览器会把COOKIE(sessionId)带过来,找到对应的session对象。


4. 小结



  1. 会话概念

    1. 会话就相当于一次通话,表示从浏览器和服务器的一次通话过程【多次请求和响应】

    2. 会话建立:打开浏览器第一次请求服务器

    3. 会话结束:直到浏览器和服务器有一方关闭



  2. 为什么要使用会话技术?

    1. 要保持一次会话中的重要数据

    2. 客户端会话技术:COOKIE 表示将数据保存在浏览器

    3. 服务端会话技术:session 表示将数据保存在服务器




第二章-COOKIE

知识点-COOKIE的概念和作用


1. 目标





2. 路径



  1. COOKIE的概念

  2. COOKIE的作用

  3. COOKIE的应用场景


3. 讲解


3.1 COOKIE的概念

​ COOKIE:客户端的会话技术,保存数据在浏览器!

img

​ COOKIE:一个名称和一个值 一些可选属性 COOKIE存储的数据大小和个数都有限

​ COOKIE写入:response.addCOOKIE() 将COOKIE从服务器 写入到浏览器

​ COOKIE获取:request.getCOOKIEs()

image-20210527100605866


3.2 COOKIE的作用



  1. 在浏览器中存放数据

  2. 将浏览器中存放的数据携带到服务器


3.3 COOKIE的应用场景

1.记住用户名

当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.

img

2.自动登录(记住用户名和密码)

当用户在淘宝网站登录成功后,浏览器会记录登录成功的用户名和密码,下次再访问该网站时,自动完成登录功能.

以上这些场景都是使用会话COOKIE实现的,将上次的信息保存到了COOKIE中,下次直接从COOKIE中获取数据信息

img

3.保存网站的上次访问时间

我们访问网站的时候,通常会看到网站上显示上次访问时间,这些信息就是在用户访问网站的时候保存在COOKIE中的

4.保存电影的播放进度

​ 在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到COOKIE中


4. 小结

COOKIE:客户端会话技术,将数据保存在浏览器。使用COOKIE保存用户各自的数据

image-20210527100755131

COOKIE特点:

1. COOKIE保存会话数据在客户端浏览器
2. COOKIE保存数据大小以及个数有限

COOKIE使用场景:



  1. 记住用户名和密码【登录前】

  2. 自动登录

  3. 记录上次访问时间

  4. 记录电影播放进度


知识点-COOKIE的快速入门【重点】


1.目标





2.路径



  1. 相关的API

  2. 入门代码


3.讲解


3.1相关的API



  • 创建一个COOKIE对象(COOKIE只能保存字符串数据。可以保存中文 但是要求tomcat版本8.5+)

new COOKIE(String name,String value);


  • 把COOKIE写入浏览器

response.addCOOKIE(COOKIE);


  • 获得浏览器带过来的所有COOKIE:

request.getCOOKIEs() ; //得到所有的COOKIE对象。是一个数组,开发中根据key得到目标COOKIE


  • COOKIE的 API

COOKIE.getName() ; //返回COOKIE中设置的name
COOKIE.getValue(); //返回COOKIE中设置的value

3.2入门代码

@WebServlet("/COOKIE01")
public class COOKIEServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("COOKIEServlet01...");
//设置COOKIE 响应给客户端浏览器
//1.创建COOKIE对象
COOKIE COOKIE = new COOKIE("name", "shuaige");
//2.使用response将COOKIE输出到客户端浏览器
response.addCOOKIE(COOKIE);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

@WebServlet("/COOKIE02")
public class COOKIEServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("COOKIEServlet02...");
//3.获取客户端请求携带的COOKIE数据
COOKIE[] COOKIEs = request.getCOOKIEs();
for (COOKIE COOKIE : COOKIEs) {
System.out.println(COOKIE.getName()+" "+COOKIE.getValue());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

3.3:COOKIE工具类抽取

package com.itheima.utils;
import javax.servlet.http.COOKIE;
public class COOKIEUtils {
//根据COOKIE的name获取COOKIE的value
public static String getCOOKIEValue(COOKIE[] COOKIEs,String name){
//如果COOKIEs数组 为null 或者 COOKIE的name为null或空串 直接返回null
if (COOKIEs==null || name==null || name.equals("")){
return null;
}
for (COOKIE COOKIE : COOKIEs) {
if(COOKIE.getName().equals(name)){
return COOKIE.getValue();
}
}
return null;
}
}

4.小结

image-20191211091737956



  1. COOKIE的特点

    1. COOKIE是一门客户端会话技术,保存数据在客户端浏览器

    2. COOKIE在第一次请求时没有,通过服务器以响应头的方式写给浏览器,在浏览器第二次发送 请求时,就会携带COOKIE到服务器

    3. COOKIE存储的字符串数据

    4. COOKIE存储的大小以及个数有限

    5. COOKIE存储数据不安全 因此COOKIE会存储一些私人数据或不重要的数据



  2. COOKIE使用的API

    1. 创建COOKIE对象:COOKIE COOKIE = new COOKIE(String name,String value);

    2. COOKIE写入:response.addCOOKIE(COOKIE);

    3. COOKIE获取:COOKIE[] COOKIEs = request.getCOOKIEs();

    4. 获取COOKIE名称:COOKIE.getName();

    5. 获取COOKIE值:COOKIE.getValue();




知识点-COOKIE进阶【重点】


1.目标



  • 掌握设置COOKIE的有效时长和路径


2.步骤



  • COOKIE的分类【COOKIE的有效时间】

  • COOKIE的有效路径


3.讲解


3.1COOKIE的分类



  • 会话级别COOKIE

​ 在默认的情况下,当浏览器进程结束(浏览器关闭,会话结束)的时候,COOKIE就会消失。



  • 持久性COOKIE

    ​ 给COOKIE设置有效期.COOKIE.setMaxAge(int expiry) :时间是秒

    ​  -1:默认 会话级别。代表COOKIE数据存到浏览器关闭(保存在浏览器文件中)。

    正整数:以秒为单位保存数据有有效时间(把缓存数据保存到磁盘中)

    ​  0:代表删除COOKIE.如果要删除COOKIE要确保路径一致

    @WebServlet("/COOKIE03")
    public class COOKIEServlet03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("COOKIEServlet03...");
    //设置COOKIE 响应给客户端浏览器
    //1.创建COOKIE对象
    COOKIE COOKIE = new COOKIE("name", "shuaige");
    //设置COOKIE的有效时间 -1:默认会话级别,浏览器一关闭COOKIE消失 0:删除COOKIE
    //COOKIE.setMaxAge(60*2);
    COOKIE.setMaxAge(0);
    //2.使用response将COOKIE输出到客户端浏览器
    response.addCOOKIE(COOKIE);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    }



3.2COOKIE设置有效路径

setPath(String url) ;设置路径

​ 有效路径作用 :



  1. 保证不会携带别的网站/项目里面的COOKIE到我们自己的项目(一个是域名ip地址隔离,一个路径隔离)

  2. 如果路径不一样, COOKIE的name可以相同

  3. 保证自己的项目可以合理的利用自己项目的COOKIE(默认路径: /项目部署路径 eg:/day24)



  • 默认路径,例如:



    • 访问http://localhost:8080/day24/demo01; COOKIE默认路径 /day24



    • 访问http://localhost:8080/day24/aaa/demo01; COOKIE默认路径 /day24/aaa



    • 访问http://localhost:8080/day24/aaa/bbb/demo01; COOKIE默认路径 /day24/aaa/bbb





  • 携带COOKIE需要的条件: 只有当访问资源的url上一级目录与此COOKIE的有效path完全匹配的时候,才会携带这个COOKIE; url上一级目录如果是COOKIE有效路径的子目录也可以获取到反之不会.



    • eg:setPath("/")



      • http://localhost:8080/day23/COOKIEDemo /day23是/的子目录



    • http://localhost:8080/day24/COOKIEDemo02 /day24是/的子目录



    • eg: 设置COOKIE的路径 /day24/demo02

      下次访问路径:http://localhost:8080/day24/demo02/abc/ccc; COOKIE是可以带过来

      下次访问路径:http://localhost:8080/day24/demo03; COOKIE带不过来





  • COOKIE的路径通常设置 / 或者为发布项目名设置的有效是 /day24. 当前项目下的Servlet都可以使用该COOKIE. 一般这么设置: COOKIE.setPath(request.getContextPath());

    只要是当前项目里面的资源 路径必须包含项目名路径.

    /**
    * COOKIE的基本使用
    */
    @WebServlet("/aa/COOKIE04")
    public class COOKIEDemo04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("COOKIEDemo04...");
    //COOKIE的基本使用
    //1.创建COOKIE对象
    //COOKIE使用细节1:COOKIE原来不可以存中文和特殊字符 tomcat8.5版本之后可以存储中文但是依然不能存储特殊字符
    //COOKIE如果想存储特殊字符 需要将COOKIE的value使用URLEncoder进行编码,获取时就需要使用URLDecoder解码
    //COOKIE存入时编码:URLEncoder.encode(value,"UTF-8");
    //COOKIE取出时解码:URLDecoder.decode(value,"UTF-8");
    String value = URLEncoder.encode("黄 文 龙", "UTF-8");
    COOKIE COOKIE = new COOKIE("name",value);
    //COOKIE使用细节2:可以一次写入多个COOKIE
    COOKIE COOKIE1 = new COOKIE("address", "深圳");
    /*设置有效路径:COOKIE.setPath();
    如果不设置COOKIE有效路径:默认就是是当前servlet的资源路径
    eg:/day25/COOKIE01 --> /day25
    eg:/day25/aa/COOKIE04 --> /day25/aa
    获取COOKIE所在的servlet资源路径只有与COOKIE路径同级或在其子目录下才能获取到COOKIE
    COOKIE的路径一般设置为当前项目虚拟路径,这样就可以实现COOKIE在当前项目下进行共享了【也就是在任何地方Servlet中都可以获取COOKIE】
    最后:这里大家只作了解 一般我们不设置COOKIE的有效路径 实际使用中一般只设置有效时间
    */
    COOKIE.setPath(request.getContextPath());
    COOKIE1.setPath("/day25");
    //2.使用response将COOKIE写入到浏览器
    response.addCOOKIE(COOKIE);
    response.addCOOKIE(COOKIE1);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    }



4.小结



  1. COOKIE的有效时长:COOKIE.setMaxAge(int seconds)

    1. -1:默认值,表示会话级别 浏览器一关闭则COOKIE删除

    2. 0:删除COOKIE

    3. 正整数:表示COOKIE的有效时间 单位是秒



  2. COOKIE的有效路径:COOKIE.setPath(String path);

    1. 不同路径下的COOKIE名称可以一样

    2. COOKIE默认路径是当前Servlet所在资源路径

    3. COOKIE有效路径一般设置为当前项目的虚拟路径:setPath(request.getContextPath());

    4. COOKIE存储设置路径,在其路径同级目录和子目录下都可以访问到该COOKIE



  3. COOKIE存储中文及特殊字符

    1. tomcat已经解决了COOKIE中文存储,但是仍然不能存储特殊字符,比如空格...

    2. 存储时编码:URLEncoder.encode(value,"UTF-8");

    3. 获取时解码:URLDecoder.decode(value,"UTF-8");



  4. COOKIE可以一次存储多个


案例-记录用户各自的上次访问时间


1.需求

img

​ 在访问一个资源的时候,展示上次访问的时间

​ 若是第一次访问则展示:你是第一次访问,若不是第一次则展示:你上次访问的时间是:xxxx


2.分析

image-20210205112228970


3.代码实现

package com.itheima.web.COOKIE;
import com.itheima.utils.COOKIEUtils;
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;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/rem")
public class RememberServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求响应中文乱码处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
COOKIE[] COOKIEs = request.getCOOKIEs();
//1.根据COOKIE的name【lastTime】获取上次访问时间
String lastTime = COOKIEUtils.getCOOKIEValue(COOKIEs, "lastTime");
//2.判断value
if(lastTime==null){
//3.1:value==null:第一次访问       
//获取当前时间,记录在COOKIE中,写入到浏览器     
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
COOKIE COOKIE = new COOKIE("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
response.addCOOKIE(COOKIE);
//响应浏览器  用户 你是第一次访问
response.getWriter().print("你是第一次访问!");
}else{
//3.2:value!=null:显示上次访问时间       
//获取当前时间,记录在COOKIE中,写入到浏览器 
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
COOKIE COOKIE = new COOKIE("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
response.addCOOKIE(COOKIE);
//响应浏览器 用户  你上次访问的时间
response.getWriter().print("你上次访问时间是:"+ URLDecoder.decode(lastTime,"UTF-8"));
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

4.小结

image-20210901110247022


第三章-Session

知识点-session概述


1.目标





2.路径



  1. session概述

  2. COOKIE和Session的不同

  3. Session的执行原理


3.讲解


3.1session概述

session是服务器端的会话技术,用于保存数据在请求间实现数据共享。

​ session是服务器端的会话技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到COOKIE中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象


3.2COOKIE和Session的不同



  • Session将数据保存在服务器端,COOKIE将数据保存在客户端浏览器

  • session一般保存比较重要的数据,COOKIE保存的相对不重要比较私人的数据

  • session存储的是对象Object,COOKIE存储的是字符串数据

  • session在数据的存储上没有限制,COOKIE存储数据量大小以及个数都有限制

  • session是基于COOKIE实现的


3.3Session的执行原理

​ 1、获得COOKIE中传递过来的SessionId(COOKIE)(浏览器请求服务器会将该项目路径下的COOKIE带过去)

​ 2、如果COOKIE中没有sessionid,则创建session对象(第一次调用request.getSession()创建Session对象

​ 3、如果COOKIE中有sessionid,找指定的session对象

​ 如果有sessionid并且session对象存在,则直接使用

如果有sessionid,但session对象销毁了,则执行第二步


注意:



  1. 第一次调用request.getSession()才会创建session对象,不调用则session对象不存在

  2. session对象的生命周期范围就是从第一次调用request.getSession(),session对象被创建,当关闭浏览器,session对象被持久化到硬盘

  3. session对象在创建时,会自动产生sessionId,由服务器通过COOKIE方式写入到浏览器缓存中,该COOKIE的name是JSESSIONID


image-20191211112121400


4.小结

​ session:服务器端会话技术,保存数据在服务器内存中。

​ COOKIE和session的区别:

1. COOKIE存储会话数据在客户端浏览器,session存储数据在服务器
2. COOKIE存储的是字符串数据,session存储的是Object对象
3. COOKIE存储的数据量大小和个数有限,session没有限制
4. COOKIE一般存储不重要的数据,session存储重要数据
5. session基于COOKIE实现的

​ session工作原理:

1. 第一次请求,通过request.getSession()创建session对象
2. 创建完session对象时,会生成sessionId,保存到COOKIE中响应给客户端浏览器
3. 第二次请求时,客户端浏览器会携带sessionId到服务器,服务器就根据sessionId找到对应的session对象使用

知识点-Session的基本使用【重点】


1.目标





2.路径



  • Session基本使用


3.讲解

​ ServletContext:整个应用

​ request:一次请求

​ Session使用:作为域对象存储数据使用

范围: 一次会话(多次请求) 保存用户各自的数据(以浏览器为单位)



  • request.getSession(); 获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)

  • Object getAttribute(String name) ;获取值

  • void setAttribute(String name, Object value) ;存储值

  • void removeAttribute(String name) ;移除

@WebServlet("/session01")
public class SessionServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet01...");
//使用Session共享数据 范围:一次会话:多次请求中
//1.获取Session对象
HttpSession session = request.getSession();
//2.调用方法存储数据
session.setAttribute("sname","优秀");
System.out.println("session01:"+session);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

@WebServlet("/session02")
public class SessionServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet02...");
//获取session中的共享数据
HttpSession session = request.getSession();
Object sname = session.getAttribute("sname");
System.out.println("sname = " + sname);
System.out.println("session02:"+session);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

session有效期

方式一:tomcat设置session失效时间,默认30min

conf/web.xml

image-20210813114416910

方式二:设置失效时间 setMaxInactiveInterval(); 单位是秒

方式三:手动设置失效 invalidate();

@WebServlet("/session03")
public class SessionServlet03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet03...");
//获取session中的共享数据
HttpSession session = request.getSession();
//设置session失效
//方式二:设置失效时间 单位是秒 正数表示有效时间 负数表示永远不会过时
//session.setMaxInactiveInterval(20);
//方式三:手动设置失效 立即失效
session.invalidate();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

session持久化



  1. 浏览器关闭,会话结束,此时session对象有没有被销毁?没有

    session对象虽然还存在,但是找不到了!因为新打开浏览器发起请求,产生了一个新的sessionId,找不到 原来的session对象了。

    /**
    * 使用COOKIE持久化session
    */
    @WebServlet("/session04")
    public class SessionServlet04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("SessionServlet01...");
    //使用Session共享数据 范围:一次会话:多次请求中
    //1.获取Session对象
    HttpSession session = request.getSession();
    //2.调用方法存储数据
    session.setAttribute("sname","优秀");
    System.out.println("session01:"+session.getId());
    System.out.println("session01:"+session);
    //将sessionId存入 COOKIE中
    COOKIE COOKIE = new COOKIE("JSESSIONID",session.getId());
    COOKIE.setMaxAge(60);
    response.addCOOKIE(COOKIE);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    }


  2. 如果服务器正常关闭,浏览器没有关闭,session对象有没有被销毁?还能不能获取到session中存储的数据?

    session钝化:指的是服务器正常关闭,会自动将session数据持久化保存到硬盘的文件上。

    session活化:指的是服务器正常启动,会将持久化的session数据加载到内存中,重新创建一个session对象,存储活化后的数据,但是sessionId没有改变。

    注意:session的钝化和活化是服务器自动完成的,我们了解服务器的这种机制即可。

    image-20210813121641850




4.小结



  1. session基本使用 范围:一次会话【多次请求】



    1. 获取session对象 :request.getSession();

      2. 存值:session.setAttribute(key,value);

      3. 取值:session.getAttribute(key);

      4. 移除:session.removeAttribute(key);



  2. session有效期设置



    1. 设置有效时间:session.setMaxInactiveInterval(int seconds);

    2. 手动设置失效:session.invalidate();




知识点-三个域对象比较


1.目标





2.路径



  1. 三个域对象比较

  2. 三个域对象怎么选择


3.讲解


3.1三个域对象比较



































域对象创建销毁作用范围应用场景
ServletContext服务器启动服务器正常关闭/项目从服务器移除整个项目记录访问次数,聊天室
HttpSession第一次调用request.getSession()方法session过期(默认30分钟)/调用invalidate()方法/服务器正常关闭会话(多次请求)验证码校验, 保存用户登录状态
HttpServletRequest来了请求响应这个请求(或者请求已经接收了)一次请求servletA和jsp(servletB)之间数据传递(转发的时候存数据)

范围:httpServletReques【一次请求】--> HttpSession【一次会话】 --> ServletContext【整个应用】

基本使用:

​ 存储数据:setAttribute(String name,Object value);

​ 获取数据:getAttribute(String name);

​ 移除数据:RemoveAttribute(String name);


3.2三个域对象怎么选择?



  1. 常规选择:一般使用范围最小的能完成就选择最小的

  2. 具体请求选择:

    1. 转发:使用request作用域 重定向:使用session

    2. 查询:使用request作用域

    3. 根据范围:一次请求:【request】 一次会话:【session】 整个应用:【ServletContext】




案例-一次性验证码校验


1.需求

img

​ 在网站登录的时候,生成一个验证码.登录的时候对验证码进行校验.


2.分析

2.1:创建登录页面login.html

2.2:验证码图片生成

​ 1.导入验证码生成jar包

​ 2.编写验证码生成Servlet CodeServlet

​ 生成验证码

​ 响应给页面

2.3:填写登录信息以及验证码,进行验证码比对登录LoginServlet

image-20210527152414790


3.实现



  • 登录页面









用户登录

用户名:

密码:

验证码:

image-20201208153954284

image-20201208154202618

HttpJspBase extends HttpServlet

JSP就是一个Servlet

JSP = Servlet+Html


JSP会翻译(通过默认的JspServlet,JSP引擎)成Servlet(.java),Servlet编译成class文件

​ JSP执行流程

1. 客户端发起第一次请求xxx.jsp,服务器就会找到对应的jsp文件
2. 服务器会将jsp文件翻译成xxx_jsp.java
3. 将xxx_jsp.java编译成xxx_jsp.class
4. 服务器执行xxx_jsp.class文件 输出结果给客户端浏览器

img


3.小结



  1. JSP:是一个动态网页,在jsp中既可以写java代码,又可以写html代码,作用:简化开发



  2. JSP本质就是一个Servlet



  3. JSP执行流程:请求-->index.jsp-翻译->index_jsp.java-编译->index_jsp.class-->执行-->响应给浏览器



  4. 在目前实际开发中,jsp基本不再使用了,1.执行效率低下 2.不利于分工协作




知识点-JSP基本语法


1.目标



  • 掌握JSP脚本和注释


2.讲解


2.1JSP脚本

我们可以通过JSP脚本在JSP页面上编写Java代码. 一共有三种方式:



























类型翻译成Servlet对应的部分注意
<%...%>:Java程序片段翻译成Service()方法里面的内容, 局部的
<%=...%>:输出表达式翻译成Service()方法里面的内容,相当于调用out.print()输出表达式不能以;结尾
<%!...%>:声明成员变量翻译成Servlet类里面的内容


  • eg

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>





<%!
//声明成员变量或方法 会被翻译到Servlet类中
String hehe = "hehe SZ118";
%>
<%
//编写java代码
System.out.println("Hello world!");
//声明一个变量 局部变量 会被翻译到service方法中
String msg = "Hello";
%>
Hello World
<%--输出表达式:用于输出数据到页面--%>

<%=msg %>


<%=hehe %>





2.2JSP注释



















注释类型
HTML注释
JAVA注释 // 、/* */
JSP注释: <%--注释内容--%>

JSP注释和java脚本中的java注释内容不会展现在网页源码中,而html注释会展现在网页源码中。

注释快捷键:Ctrl+Shift+/


3.小结



  1. 脚本

    1. <% java代码 %>:java小脚本 会被翻译到service方法中

    2. <%=变量 %>:输出表达式 用于输出内容到页面 会被翻译到service方法中

    3. <%! java代码 %>:声明 用于声明全局变量或方法 会被翻译到servlet类中



  2. 注释:

    1. jsp独有的注释:<%-- 注释内容 --%>

    2. 注意:JSP注释内容不会输出到页面,也不会显示在html的网页源代码中




案例-记住用户名案例


1.需求

image-20191120112234968


2.分析



  1. 准备一个登录页面

  2. 编写登录Servlet

  3. 登录成功的时候 判断记住用户名复选框有没有打钩

    • 打钩:记住用户名 使用COOKIE保存在客户端 设置一个有效时间 7天

    • 不打钩:不记住用户名 删除COOKIE



  4. 登录页面使用jsp,记住用户名之后,在jsp页面上使用java代码获取用户名显示


3.实现



  • LoginServlet

package com.itheima.web;
import com.itheima.bean.User;
import com.itheima.utils.C3P0Utils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
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;
import java.sql.SQLException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//设置代码模板:file--settings--editor--live temeplates
//请求响应中文乱码处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 2.获取请求参数【用户名和密码】
String username = request.getParameter("username");
String password = request.getParameter("password");
// 3.使用DBUtils操作数据库      根据用户名和密码查询数据库,返回user对象
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from user where username=? and password=?";
User user = queryRunner.query(sql,new BeanHandler<>(User.class),username,password);
// 4.根据返回处理结果进行响应      user==null:登录失败      user!=null:登录成功
if(user!=null){
String remember = request.getParameter("remember");
//登录成功
COOKIE COOKIE = new COOKIE("username", username);
if(remember!=null && remember.equals("on")){
//如果勾上记住用户名 将用户名保存在COOKIE中 并设置有效时间7天
COOKIE.setMaxAge(60*60*24*7);
}else{
//如果没有勾上记住用户名 就删除这个COOKIE
COOKIE.setMaxAge(0);
}
response.addCOOKIE(COOKIE);
response.getWriter().print("登录成功!");
}else{
response.getWriter().print("登录失败!");
}
} catch (Exception e) {
e.printStackTrace();
response.getWriter().print("服务器异常!");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}


  • login.jsp

<%@ page import="com.itheima.utils.COOKIEUtils" %>
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>






用户登录

<%
String username = COOKIEUtils.getCOOKIEValue(request.getCOOKIEs(),"username");
username = username==null?"":username;
%>
姓名:

密码:

记住用户名






4.小结



  1. 用户勾选了记住用户名复选框,我们把用户名存到COOKIE里面,并设置有效时间



  2. 在index.jsp里面 从COOKIE取出用户名展示

    String remember = request.getParameter("remember");
    //登录成功
    COOKIE COOKIE = new COOKIE("username", username);
    if(remember!=null && remember.equals("on")){
    //如果勾上记住用户名 将用户名保存在COOKIE中 并设置有效时间7天
    COOKIE.setMaxAge(60*60*24*7);
    }else{
    //如果没有勾上记住用户名 就删除这个COOKIE
    COOKIE.setMaxAge(0);
    }
    response.addCOOKIE(COOKIE);



总结

  1. 会话



    • 概念:浏览器和服务器的一次通话过程,称为会话

    • 会话产生:第一次打开浏览器,请求服务器并建立连接

    • 会话结束:指定服务器或浏览器两方有一方断开,会话结束

    • 会话技术:保存会话过程中产生的数据

      • COOKIE:保存数据在客户端浏览器

      • session:保存数据在服务器端





  2. COOKIE



    • 概念:客户端的会话技术



    • 基本使用

      //1.创建COOKIE对象
      COOKIE COOKIE = new COOKIE(String name,String value);
      //2.写入COOKIE到浏览器
      response.addCOOKIE(COOKIE);
      //3.获取COOKIE
      request.getCOOKIEs();
      COOKIE.getName();
      COOKIE.getValue();


    • 进阶使用

      //1.设置COOKIE的有效时长
      COOKIE.setMaxAge();//-1:默认 会话级别 正整数:有效时间s 0:删除当前COOKIE
      //2.设置COOKIE的有效路径
      COOKIE.setPath();
      //3.COOKIE存储中文和特殊字符
      URLEncoder.encode(value); //编码
      URLDecoder.decode(value); //解码




  3. Session



    • 概念:服务器端的会话技术



    • 基本使用

      //获取Session对象
      request.getSession();
      //存储数据
      setAttribute(String name,Object value);
      //获取数据
      getAttribute(String name);
      //移除数据
      removeAttribute(Sring name);


    • 进阶使用

      //1.设置Session的有效时间
      session.setMaxInactiveInterval(20); //单位是s
      //2.在tomcat的web.xml中设置Session有效时间 单位是minutes
      //3.设置Session手动失效
      session.invalidate();
      /*4.session持久化【了解】
      1.手动持久化 将SessionId存入到COOKIE,并设置有效时间
      2.自动持久化 服务器完成 ,当服务器正常关闭,进行Session钝化,
      当重启服务器,进行Session活化
      */




    1. JSP



      • 概念:jsp本质上就是一个Servlet



      • JSP执行原理:index.jsp-翻译->index_jsp.java-编译->class文件-->执行



      • jsp基本语法

        <% %>:java小脚本 用于编写java代码
        <%= %>:输出表达式 用于输出内容到页面
        <%! %>:声明 用于声明全局变量或方法
        <%-- --%>:jsp注释




    2. 练习



      1. 记住用户名各自上次的访问时间

      2. 验证码登录【重点】

      3. 记住用户名案例







推荐阅读
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • Maven Web项目创建时JSP文件常见错误及解决方案
    Maven Web项目创建时JSP文件常见错误及解决方案 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 在PHP的设计中,预定义了9个超级全局变量、8个魔术变量和13个魔术函数,这些变量和函数无需声明即可在脚本的任意位置使用。这些特性在PHP开发中极为常见,能够显著提升开发效率和代码的灵活性。相比之下,Java并没有类似的内置机制,但通过其他方式如上下文对象和反射机制,也可以实现类似的功能。本文将详细探讨这两种语言中这些特殊变量和函数的使用方法及其应用场景。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
author-avatar
给糖就不骗你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有