day31_servlet

今日内容

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

零、 复习昨日

一、请求转发

1.1 现有问题

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

1.2 解决

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

1.3 演示

1.3.1 请求转发跳转servlet

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException { }@Overridepublic 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);}@Overridepublic 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException { }/*** 对请求的身份进行认证* 请求中获得session,且session中有登录时存入的数据,说明登录成功,放行* 请求中获得session,但是session中没有数据,说明没有登录,重定向到登录页*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 获取sessionHttpServletRequest 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");}}}@Overridepublic void destroy() { }
}

五、总结

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

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

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

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

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

  • 请求转发
  • 重定向

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

  • session

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

  • filter

六、作业

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 setup语法糖,常用的几个:defineProps、defineEmits、defineExpose、

vue3和vue2组件之间传参的不同 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。 <script setup> 中的代码会在每次组件实例被创建的时候执行。 任何在 <script setup> 声明的顶层的绑定 (包括变量&#xff0c;函数声明&#xff0…

卓越进行时 | 赛宁联合国家一流网络安全学院探索校企合作新模式

为进一步探索网络安全教育技术产业融合发展的新机制新模式&#xff0c;全方位培养适应行业企业需求的复合型、创新型高素质网络安全人才。11月28日&#xff0c;南京赛宁信息技术有限公司&#xff08;赛宁网安&#xff09;与东南大学以优化产教融合发展原则&#xff0c;决定加强…

C++设计模式——Bridge模式(下)

在上篇 《C设计模式——Bridge模式&#xff08;上&#xff09;》中我们对于桥接模式做了一些介绍。介于桥接模式在实际项目开发中使用广泛&#xff0c;而且也是面试中常问常新的话题。在本篇&#xff0c;我们专注bridge模式在具体的项目开发中的应用&#xff0c;举几个例子来说…

服务器修复

服务器修复 主要服务器漏洞展示未禁用sync、shutdown、halt默认账户。未创建系统管理员、审计管理员、安全管理员账户设置系统管理员设置安全管理员 设置审计管理员配置PASS_MAX_DAYS 99999、PASS_MIN_LEN 5未配置TMOUT值配置HISTSIZE0未配置登录失败/密码复杂度策略umask值022…

2021年2月18日 Go生态洞察:Go 1.16中的新模块变化

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数字时代的表演艺术:TikTok如何重新定义舞台

在数字时代的潮流中&#xff0c;TikTok崭露头角&#xff0c;重新定义了表演艺术的舞台。这款短视频应用不仅改变了用户与内容的互动方式&#xff0c;也为艺术家和创作者提供了全新的表达平台。本文将深入探讨TikTok如何在数字时代重新定义舞台&#xff0c;以及它对表演艺术的深…

基于FPGA的五子棋游戏设计

基于FPGA的五子棋游戏设计 本文基于FPGA设计五子棋游戏&#xff0c;使用按键输入&#xff0c;使用VGA接口输出。五子棋的棋具与围棋相同&#xff0c;棋子分为黑白两色&#xff0c;棋盘为1010&#xff0c;棋子放置于棋盘线交叉点上。两人对局&#xff0c;各执一色&#xff0c;轮…

【IEEE出版】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 进入21世纪以来&#xff0c;计算机技术的高速发展带来了消费电子产品的快速更迭。在技术迅速发展历…

关于免费SSL证书

JoySSL是一家提供免费SSL证书的服务商&#xff0c;它的免费SSL证书不仅包括单域名&#xff0c;还包括多域名和通配符的免费证书。这意味着&#xff0c;无论您是只有一个网站的个人用户&#xff0c;还是拥有多个子域名的企业用户&#xff0c;都可以在JoySSL找到适合您的免费SSL证…

\n\r:解析java中的\r、\n、\r\n、\n\r的区别

1 \r 1.1 内容 回车符,将光标定义到当前行行首 1.2 在idea中测试 1.2.1 表现形式 在\r后有新内容时,会先删除之前以前存在过的文本,即只打印\r后面的内容 1.2.2 示例代码 package Work; public class Test05 { public static void main(String[] args) { System.…

windows环境下载安装Nginx并配置防火墙

1、下载Nginx Nginx官网 下载稳定版 2、下载之后&#xff0c;解压 3、启动Nginx&#xff0c;命令&#xff1a;start nginx 最小化该窗口 主要&#xff0c;不要关闭&#xff0c;如果关闭&#xff0c;表示nginx服务关闭了 4、测试是否启动成功 在浏览器中输入http://localhos…

2021年09月 Scratch图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 程序中要使用不确定的数值,这时要用到的是?( ) A、图章 B、变量 C、广播 D、随机数 答案:D 第2题 执行下列程序后,角色会说?( ) A、3 B、6 C、10 D、15 答案:D 第3题…

广州华锐视点:基于VR元宇宙技术开展法律法规常识在线教学,打破地域和时间限制

随着科技的飞速发展&#xff0c;人类社会正逐渐迈向一个全新的时代——元宇宙。元宇宙是一个虚拟的、数字化的世界&#xff0c;它将现实世界与数字世界紧密相连&#xff0c;为人们提供了一个全新的交流、学习和娱乐平台。在这个充满无限可能的元宇宙中&#xff0c;法律知识同样…

关于MongoDB

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大&#xff0c;其…

Panorama SCADA平台助力智能建筑管理,掌控未来建筑!

来源&#xff1a;宏集科技 工业物联网 宏集方案 Panorama SCADA平台助力智能建筑管理&#xff0c;掌控未来建筑&#xff01; 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 前言 在现代智能建筑管理中&#xff0c;随着设施管理&#xff08;FM&#xff09;、建筑管理…

数据结构与算法--特殊的完全二叉树--堆,堆排序,利用堆解决topk的问题

目录 前言 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 …

YOLOv7独家原创改进:自研独家创新MSAM注意力,通道注意力升级,魔改CBAM

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 在道路缺陷检测任务中,原始ma…

基于STM32+定时器中断和定时器外部时钟(标准库函数讲解)

前言 本篇博客主要学习了解定时器的标准库函数&#xff0c;以及定时器中断进行LED灯的反转&#xff0c;还有定时器外部时钟获取脉冲计数功能。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本篇博客主要是对通用定时器来讲解&#xff0c;功能适中比较常…

Java高级技术(注解)

一&#xff0c;注解 二&#xff0c;案例 三&#xff0c;注解原理 四&#xff0c;元注解 五&#xff0c;案例 六&#xff0c;解析注解 七&#xff0c;案例

unity UI特效遮罩

using System.Collections; using System.Collections.Generic; using UnityEngine;/**UI特效遮罩 1.需要将ScrollRect 的遮罩Mask 换为 2D Mask2.将特效的Render里面的 Masking 设置为*/ public class UIParticleMaskControll : MonoBehaviour {// Start is called before …