day31_servlet

今日内容

零、 复习昨日
一、请求转发
二、重定向
三、Session
四、Filter

零、 复习昨日

一、请求转发

1.1 现有问题

  • 响应的代码与接收请求代码在一起
  • 查询全部的代码与登录的代码在一起,考虑一下后续删除完,更新完要查全部怎么办?
  • 这也没有遵循单一职责,不便于后期维护
  • ps: 开发6个原则:
    • 开闭原则
    • 里氏替换
    • 依赖倒置
    • 单一职责
    • 迪米特法则 (最少知道原则)
    • 接口隔离

1.2 解决

  • 将代码拆开
  • 再单独设计个Servlet去做查询全部
  • 查询全部之后做响应
  • 登录成功后,让请求转发到查询全部去执行

1.3 演示

1.3.1 请求转发跳转servlet

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("1 接收请求" );
        System.out.println("2 调用业务层处理数据" );

       // 查询全部
        /**
         * 请求转发,
         * 是服务器内部动作
         */
        // RequestDispatcher rd = req.getRequestDispatcher("/list");
        // rd.forward(req,resp);

        // 一般会简写
        req.getRequestDispatcher("/list").forward(req,resp);

        System.out.println("5 登录结束...." );

    }
}
@WebServlet("/list")
public class ListServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3查询全部数据..." );

        System.out.println("4 查询全部响应" );
    }
}

1.3.2 请求转发跳转页面

@WebServlet("/d1")
public class PageServlet  extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 请求转发是服务器动作,从服务器根路径出发
         * 服务器资源的根路径:/webapp/
         * a.html b.jsp 都定义在/webapp/下
         * c.jsp在 /webapp/WEB-INF/下,所以请求转发时需要加上WEB-INF
         */
        // req.getRequestDispatcher("/a.html").forward(req,resp);
        // req.getRequestDispatcher("/b.jsp").forward(req,resp);
        req.getRequestDispatcher("/WEB-INF/c.jsp").forward(req,resp);
    }
}

image-20230524151019552

1.4 请求域

  • **是什么?**域,就是区域,就是一块空间,存储数据,其实理解为map集合

  • 什么时候用? 在两个servlet请求转发时,会存在A类的数据需要传递给B类

    此时就需要使用请求对象的请求域功能

  • 怎么用? req.setAttribute(key,value),这样就可以将数据存储在请求对象

    ​ 再另外一个servlet使用请求对象取出值req.getAttribute(“key”)

在一个servlet中存入请求域

image-20220905102349084

在另外一个servlet中取出

image-20220905102434594

ps: 主要是配合jsp使用,在jsp中取值的,但是现在没有讲jsp,暂时了解

1.5 总结

请求转发其实两个功能

  • 利用请求对象可以发请求跳转页面或者servlet
  • 利用请求对象存取数据

1.6 特点[背住]

  • 请求转发: 地址栏不变,这是一次浏览器请求
  • 请求转发: 是服务器内部行为
  • 当做域对象使用,即相当于容器,可以装载数据
  • 两个servlet中请求域数据在一次请求转发中共享

image-20231121112508700

回忆政府办公场景…

二、响应重定向

重定向也可以使用Servlet直接的跳转,以及跳转页面.

resp.sendRedirect("路径");

演示:

image-20220905112909073

image-20220905112947513

  • 特点
    • 重定向是响应重定向,是浏览器行为
    • 两次请求
    • 地址栏会变化
    • 请求域数据无法共享

image-20231121114230478

三、Session对象【重点

状态管理,比较常见的就是登录状态

会话? 浏览器 <—> 服务器


3.1 Session概述

  • Session用于记录用户的状态。Session指的是在一段时间内,单个客户端与Web服务器的一连串相关的交互过程。
  • 在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。

3.2 Session原理

  • 服务器会为每一次会话分配一个Session对象

  • 同一个浏览器发起的多次请求,同属于一次会话(Session)

  • 首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端,后续再发请求,就会带上cookie,后端就会接收到该cookie中的sessionId从而获得session中的数据

  • 注意:session是由服务端创建的,存储在服务器
  • 注意: cookie是由服务器创建的,存储在浏览器

image-20231121144658044

3.3 Session使用

  • Session作用域:拥有存储数据的空间,作用范围是一次会话内有效
    • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
    • 可以将数据存入Session中,在一次会话的任意位置进行获取
    • 可传递任何数据(基本数据类型、对象、集合、数组)

3.3.1 获取Session

session是服务器端自动创建的,通过request对象获取

        //获取Session对象
		HttpSession session=request.getSession();
		System.out.println("Id:"+session.getId());//唯一标记,

3.3.2 Session保存数据

​ setAttribute(属性名,Object)保存数据到session中

	session.setAttribute("key",value);//以键值对形式存储在session作用域中。

ps: 登录成功后将登录信息存储到session

3.3.3 Session获取数据

​ getAttribute(属性名);获取session中数据

	session.getAttribute("key");//通过String类型的key访问Object类型的value

ps: 后续其他请求获取session,判断是否有对应的权限或者是否登录

3.3.4 Session失效

// 调用方法销毁
session.invalidate();//手工销毁
// 浏览器关闭,原有的Session会失效,相对于是没了

ps: 退出登录后,清空session

3.4 Session域与Request域应用区别

  • request是一次请求有效,只有一次请求转发内数据可以获得
  • session是一次会话内有效,无论请求转发还是重定向都是可以获得数据的

3.5 模拟登录认证[重点]

现有2个资源,一个是登录/login,一个是/list,没有登录认证之前,可以不用登录就可以访问/list所对应的资源,但是不合理,因此我们需要实现登录信息的认证!

即在操作/list等其他请求时,我们需要判断这次请求前有没有登录,如果没有登录就响应(请求转发)到登录页面,如果以前登录过,那就该干什么干什么…

如何实现?

  • 需要在登录成功时,将登录信息存入session
  • 需要在操作/list等请求时先判断session有无登录信息

登录成功后存储session

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 登录成功,session存储数据
        HttpSession session = req.getSession( );
        session.setAttribute("username","tomcat");

        System.out.println("登录...");
    }
}

其他请求中获取session

@WebServlet("/list")
public class ListServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 先判断有无登录
        HttpSession session = req.getSession( );
        String username = (String) session.getAttribute("username");
        if (username != null && !"".equals(username)) {
            // 假设这下面就是操作的功能,现在暂时用输出语句代替,,,
            System.out.println("查询全部...");
        } else {
            // 没有登录,应该跳转到登录页面
            resp.sendRedirect("/index.jsp");
        }
    }
}

退出时销毁session

  • 设置一个请求按钮,或者超链接
  • 点击退出到登录页,同时销毁session

image-20231121152040430

image-20231121152057984

3.6 总结

session的实际应用:

  • 1 登录时存储
  • 2 拦截器中取出数据,判断是否登录,如果已经登录有数据,那就放行,如果没有跳转至登录页
  • 3 退出时销毁session

四、过滤器Filter【重点


4.1 现有问题

在以往的Servlet中,有冗余的代码,多个Servlet都要进行编写。

  • 比如编码格式设置
  • 登录信息认证

4.2 概念

过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术。

过滤器
image-20230524220124509

image-20231121163149436

4.3 过滤器作用

  • 执行顺序在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter

  • 可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)

4.4 编写过滤器

Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)

  • 编写Java类实现Filter接口

  • 在doFilter方法中编写拦截逻辑

  • 设置拦截路径

    • /* 拦截所有请求路径
    • /a 拦截指定的/a请求
    • *.do 拦截指定的后缀请求

4.5 过滤器链和优先级

4.5.1 过滤器链

客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。

每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

过滤器链
image-20230524220221983

4.5.2 过滤器优先级

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
优先级:

  • 如果为注解的话,是按照类全名称的字符串顺序决定作用顺序

4.6 过滤器应用1:全局编码

以前: 在每个servlet为了防止乱码,在进行操作之前,都先设置请求和响应的编码格式.

现在: 使用拦截器,对所有请求拦截器,设置编码,然后放行


package com.qf.servlet.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 对所有请求都是设置编码格式
 */
@WebFilter("/*")
public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 设置编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");


        // 放行
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() { }
}

4.7 过滤器应用2: 身份认证拦截器

以前: 在web项目中,在每个Servlet中都要对身份进行认证

现在: 使用拦截器,将身份过滤的代码前置到拦截器,对每个请求先身份认证

package com.qf.servlet.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
@WebFilter("/*")
// @WebFilter("/hw/*")
// @WebFilter("*.do")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    /**
     * 对请求的身份进行认证
     * 请求中获得session,且session中有登录时存入的数据,说明登录成功,放行
     * 请求中获得session,但是session中没有数据,说明没有登录,重定向到登录页
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        // 获取session
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession( );

        String requestURI = req.getRequestURI( );

        /**
         * 因为是拦截所有 /*
         * 所以要放行 静态资源以及第一次登录的请求
         */
        if(requestURI.contains("login")) {
            // 放行
            chain.doFilter(request, response);
        } else {
        	// 从session获得数据
        	String username = (String) session.getAttribute("username");
        	// 判断
        	if (username != null){
            	// 放行
            	chain.doFilter(request, response);
             } else {
            	HttpServletResponse resp = (HttpServletResponse) response;
            	resp.sendRedirect("/index.jsp");
        	}
        }

    }

    @Override
    public void destroy() { }
}

五、总结

关于web开发,服务器代码,就是主要就是接收请求,作出响应

  • 如何发请求?
  • 请求如何与servlet对应?
  • 请求到Servlet类后,又是如何接收请求数据?
  • 如何作出响应?

web开发,遵循一些开发设计规范

  • 控制层,写servlet代码
  • 业务层,写业务逻辑代码
  • 数据层,写jdbc代码

如果想要跳转页面或其他servlet

  • 请求转发
  • 重定向

如果需要记录项目,登录状态,

  • session

如果需要将一些重复代码前置

  • filter

六、作业

重新写一个web项目,需求实现登录,查询全部
1) 项目启动登录页
2) 登录成功查询全部
3) 没有登录时直接查询全部,跳转到登录页
4) 利用filter,session完成登录认证和编码过滤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/201790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端编码规范

文章目录 一、背景二、内容1、注释规范&#xff08;1&#xff09;文件注释&#xff08;2&#xff09;函数注释&#xff08;3&#xff09;单行注释&#xff08;3&#xff09;多行注释 2、命名规范&#xff08;1&#xff09;项目命名&#xff08;2&#xff09;目录命名&#xff0…

C# 使用 Fody 监控方法执行时间

写在前面 在做性能调优的时候&#xff0c;经常需要跟踪具体方法的执行时间&#xff1b;通过插入Stopwatch的方案对代码的侵入性太高了&#xff0c;所以引入了 MethodTimer.Fody 类库&#xff0c;采用编译时注入的方式给方法动态加上Stopwatch 跟踪代码&#xff0c;只需要在目标…

re:Invent 构建未来:云计算生成式 AI 诞生科技新局面

文章目录 前言什么是云计算云计算类型亚马逊云科技云计算最多的功能最大的客户和合作伙伴社区最安全最快的创新速度最成熟的运营专业能力 什么是生成式 AI如何使用生成式 AI后记 前言 在科技发展的滚滚浪潮中&#xff0c;我们见证了云计算的崛起和生成式 AI 的突破&#xff0c…

Python - Real-ESRGAN 提升图像、视频清晰度 - 最高可达 4 K

目录 一.引言 二.Real-ESRGAN 理论 1.模型简介 2.经典退化模型 ◆ 退化过程全览 ◆ K - 高斯滤波 ◆ N - 噪声 ◆ ↓r - Resize ◆ jpeg - 压缩 3.高阶退化模型 4.环形和超调伪影 5.网络结构 ◆ ESRGAN 生成器 ◆ U-Net 鉴别器 三.Real-ESRGAN 实战 1.快速体验…

YashanDB入选2023年世界互联网大会领先科技奖成果集《科技之魅》

近日&#xff0c;由深圳计算科学研究院自主研发的“崖山数据库系统YashanDB”入编2023年世界互联网大会领先科技奖成果集《科技之魅》。此次入选&#xff0c;充分彰显了YashanDB在数据库技术领域的突破性创新成果。 《科技之魅》是世界互联网大会领先科技奖的重要成果&#xff…

安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC]

文章目录 安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利…

【python+Excel】读取和存储测试数据完成接口自动化测试

http_request2.py用于发起http请求 #读取多条测试用例 #1、导入requests模块 import requests #从 class_12_19.do_excel1导入read_data函数 from do_excel2 import read_data from do_excel2 import write_data from do_excel2 import count_case #定义http请求函数COOKIENon…

国密加密工业路由器 数据安全升级

国密加密工业路由器&#xff0c;简称国密加密路由器&#xff0c;是指遵循“商用密码管理规范”中规定的国家商用密码算法&#xff0c;采用国密加密芯片和密码算法的专业路由器。相比-般路由器&#xff0c;国密加密路由器具有更高级别的加密保护&#xff0c;可以有效提高数据传输…

昨日一题 1670. 设计前中后队列(中等,列表)

维护左右两个队列&#xff0c;控制左队列的长度比右队列长&#xff0c;且不超过1pushFront 往左队列的左边添加元素pushMiddle 往左队列的右边或者右队列的左边添加元素其余同理&#xff0c;可以参照代码 class FrontMiddleBackQueue:def __init__(self):self.llist, self.rli…

如何保证缓存和数据库的双写一致性?

一、什么是数据库和缓存双写一致性&#xff1f; 在分布式系统中&#xff0c;数据库和缓存会搭配一起使用&#xff0c;以此来保证程序的整体查询性能。也就说&#xff0c;分布式系统为了缓解数据库查询的压力&#xff0c;会将查出来的数据保存在缓存中&#xff0c;下次再查询时…

代码随想录算法训练营第五十九天| 503.下一个更大元素II 42. 接雨水

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 503.下一个更大元素II class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:res [-1] * len(nums)stack []for i in…

Vue性能优化方法

一、前言 1.1 为什么需要性能优化 用户体验&#xff1a;优化性能可以提升用户体验&#xff0c;降低加载时间和响应时间&#xff0c;让用户更快地看到页面内容。SEO优化&#xff1a;搜索引擎更喜欢快速响应的网站&#xff0c;优化性能可以提高网站的排名。节约成本&#xff1…

【知识】稀疏矩阵是否比密集矩阵更高效?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说&#xff0c;稀疏图比密集图的计算效率更高&#xff0c;真的吗&#xff1f; 原因猜想 这里的效率高&#xff0c;应该是有前提的&#xff1a;当使用稀疏矩阵的存储格式(如CSR)时&#xff0c;计…

云时空社会化商业 ERP 系统 Shiro 反序列化漏洞复现

0x01 产品简介 时空云社会化商业ERP&#xff08;简称时空云ERP&#xff09; &#xff0c;该产品采用JAVA语言和Oracle数据库&#xff0c; 融合用友软件的先进管理理念&#xff0c;汇集各医药企业特色管理需求&#xff0c;通过规范各个流通环节从而提高企业竞争力、降低人员成本…

Linux相关--笔试和面试高频

Linux RedHat公司已经宣布停止维护CentOS服务器操作系统&#xff0c;可以选择华为开源的欧拉系统、阿里开源的龙蜥系统和腾讯开源的TencentOS系统 面试 几个基本的Linux命令 pwd #查看当前绝对路径 结果/home/stu touch / vi编辑器 #创建文件 mkdir -p /home/stu/test #当…

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容 概述 什么是 AJAX &#xff1f; AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种用于创建快速动态网页的技术。 传统的网页&#xff08;不使用 AJAX&#…

鸿蒙原生应用/元服务开发-AGC分发如何下载管理Profile

一、收到通知 尊敬的开发者&#xff1a; 您好&#xff0c;为支撑鸿蒙生态发展&#xff0c;HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS应用/元服务的Profile文件更新&#xff0c;更新后Profile文件中已扩展App ID信息&#xff1b;后续上架流程会检测API9以上Harm…

直接套用的软件详细设计说明书

软件开发全套资料过去进主页&#xff01;

stm32 计数模式

计数模式 但是对于通用定时器而言&#xff0c;计数器的计数模式不止向上计数这一种。上文基本定时器中计数器的计数模式都是向上计数的模式。 向上计数模式&#xff1a;计数器从0开始&#xff0c;向上自增&#xff0c;计到和自动重装寄存器的目标值相等时&#xff0c;计数器清…

安卓apk抓包

起因 手机&#xff08;模拟器&#xff09;有时候抓不到apk的包&#xff0c;需要借助Postern设置一个代理&#xff0c;把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理&#xff0c;把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…