ServletFilterListenerMybatis预编译生命周期

目录

0x00 前言

0x01 Servlet&路由&生命周期

0x02 JDBC&Mybatis

0x03 预编译 SQL

0x04 Filter 过滤器

0x05 Listener 监听器


0x00 前言

很久没有更新 CSDN 博客了,原因是搭建了个人博客网站,但现在决定还是同步到 CSDN

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

0x01 Servlet&路由&生命周期

参考:JAVAEE的核心-Servlet_javaee servlet-CSDN博客
1、解释

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet 可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

2、创建和使用 Servlet

  • 第一步,创建一个类继承 HttpServlet
  • 第二步,在 web.xml 配置 Servlet 路由,或者使用 @WebServlet 配置(后面的 Filter、Listener 对应 @WebFilter、@WebListener)
  • 第三步,写入内置方法(init、service、destroy、doGet、doPost ......)

关于 web.xml:

  •  web.xml 是 web 应用的配置文件,它必须存放在 webapp/WEB-INF/ 目录下面
  • 用于对 web 应用下的web资源进行配置,服务器在启动时会读取 web.xml 文件中的内容

关于 url-pattern 匹配模式:

  • / 代表当前web应用的根目录
  • 精确匹配,例如:/test
  • 匹配任意的url,例如:/*

以下是使用 @WebServlet 配置 Servlet 路由的示例:

以下是在 web.xml 中配置 Servlet 路由的示例:

以下是测试 doGet 方法,浏览器 GET 方式请求 http://localhost:8080/demo1/index?name=ch4ser,页面和控制台都会有打印输出。

同理,可以测试 doPut、doDelete 等方法。
3、Servlet 的生命周期

以下是测试 init、service、destroy 方法:

当浏览器 GET 方式请求 http://localhost:8080/demo1/index?name=ch4ser,IDEA 控制台输出:

---------Init---------
---------Servlet Service---------
---------Http Service---------
--------doGET---------

当 Tomcat 服务器关闭时,IDEA 控制台输出:---------Destroy---------

注意上面两个不同的 service 方法:

  • service(ServletRequest req, ServletResponse res):这个方法是 Servlet 的父类 GenericServlet 中定义的方法。用于处理通用的请求和响应
  • service(HttpServletRequest req, HttpServletResponse resp):这个方法是 Servlet 的子类 HttpServlet 中定义的方法。用于处理 HTTP 请求和响应

所以,如果只需要处理通用的请求和响应,可以使用service(ServletRequest req, ServletResponse res)方法。

而如果需要处理HTTP请求和响应,可以使用service(HttpServletRequest req, HttpServletResponse resp)方法,它提供了更多的HTTP相关的功能和信息。

0x02 JDBC&Mybatis

1、原生态数据库开发:JDBC

参考:JavaEE-JDBC基础 - 简书 (jianshu.com)

JDBC:由 Java 提供,用于访问数据库的统一 API 接口规范。
数据库驱动:由各个数据库厂商提供,用于访问数据库的 jar 包(JDBC的具体实现),遵循 JDBC 接口,以便 Java 程序员使用。

  • 下载数据库驱动 jar 包:Maven Repository: Search/Browse/Explore (mvnrepository.com)
  • 引用封装 jar包:项目根目录下创建一个 lib 目录,复制导入 lib 后,右键选择添加为库

使用 JDBC 操作数据库:

  • 注册数据库驱动
  • 建立数据库连接
  • 创建 Statement 执行SQL语句
  • 输出查询 ResultSet
  • 关闭连接,释放资源

以下是一段使用 JDBC 操作数据库的简单代码:

2、持久层框架 Mybatis

MyBatis是一种持久层框架,用于将Java对象映射到关系数据库中的数据。它提供了一种将SQL语句与Java对象进行映射的简单方法,从而减少了开发人员编写和维护传统JDBC代码的工作量。

MyBatis的核心是一个基于XML的配置文件,其中定义了数据库连接信息、SQL语句和结果映射规则。开发人员可以通过编写简单的XML文件来定义SQL语句,并在Java代码中使用MyBatis的API来执行这些SQL语句。

MyBatis提供了丰富的功能,包括动态SQL、批处理、缓存、插件扩展等。它支持多种数据库,包括MySQL、Oracle、SQL Server等。同时,MyBatis还提供了与Spring等常用框架的集成支持,使得在企业应用中使用MyBatis变得更加方便。

总的来说,MyBatis是一种简单易用、功能丰富的Java持久层框架,可以帮助开发人员更轻松地进行数据库访问操作。

0x03 预编译 SQL

1、预编译原理

提前编译好执行逻辑或语义,攻击者所注入的语句并不会改变原有的逻辑或语义,从而预防 SQL 注入。

2、写法示例

3、不安全的写法和预编译写法的对比

        //不安全写法String unsafe_sql = "select * from stu where id="+s;Statement statement = connection.createStatement();ResultSet rs = statement.executeQuery(unsafe_sql);//预编译写法String safe_sql = "select * from stu where id=?";PreparedStatement preparedStatement = connection.prepareStatement(safe_sql);preparedStatement.setString(1,s);ResultSet rs = preparedStatement.executeQuery();

0x04 Filter 过滤器

1、解释

Filter 被称为过滤器,实质上就是对 Web 资源进行拦截,做一些处理后再交给下一个过滤器或 Servlet 处理。

通常是用来拦截 Request 请求进行拦截处理的,但也可以对返回的 Response 进行拦截处理。

开发人员使用 Filter 技术,可以实现对所有 Web 资源的管理,如实现权限访问控制、过滤敏感词汇、压缩响应信息等。

在讲如何创建和使用 Filter 之前,先来看看完整的请求、响应的过程:

2、Filter 生命周期

下面通过一段 Servlet 和一段 Filter 代码来验证一下 Filter 的生命周期。

这是 Servlet 的代码:

这是 Filter 的代码:

这是 web.xml 的配置:

验证结果:

  • 当中间件(项目)启动时,IDEA 控制台输出 "xss过滤开启",也就是 init 方法
  • 当中间件(项目)停止时,IDEA 控制台输出 "xss过滤销毁",也就是 destroy 方法
  • 当访问 /test 时,IDEA 控制台输出 "xss正在过滤",也就是 doFilter 方法

这里 Filter 是 implements 而不是 extends,以下是二者的区别:

  • implements 关键字用于实现接口,继承类需要实现接口中定义的所有方法
  • extends 关键字用于继承类,继承类可以使用父类的方法和属性,并可以添加新的方法和属性

但此时访问 /test?code=xxx,发现页面并没有输出 xxx,这是由于我们没有在 doFilter 方法里写上放行的代码,其默认全部禁止。

3、使用 doFilter 实现简单拦截过滤

这里修改 doFilter 方法,实现一个简单的 XSS 攻击拦截过滤:接收参数值,如果没有攻击 payload 就放行,有的话则拦截。

验证结果:

  • 访问 /test?code=123,页面正常显示 code=123,也就是 doFilter 方法将其放行
  • 访问 /test?code=<script>alert(1)</script>,页面无显示,IDEA 控制台输出 "存在xss攻击",也就是 doFilter 方法将其拦截

4、使用 doFilter 实现简单身份访问控制

以下为 Servlet 的代码,模拟一个管理员界面:

以下为 Filter 的代码,根据 cookie 判断是否为管理员,若是则放行,反之则拦截:

以下是 web.xml 的配置:

验证结果:

  • cookie 无 user=admin 时,访问 /admin 被拦截,IDEA 控制台输出 "非法访问,已拦截"
  • cookie 有 user=admin 时,正常进入 /admin 页面,IDEA 控制台输出 "欢迎进入管理员界面"

5、Filter 过滤器的安全场景

  • Payload检测
  • 权限访问控制
  • 红队内存马植入,蓝队清理内存马等

内存马参考:深入浅出内存马(一) (qq.com)

0x05 Listener 监听器

1、解释

参考:JavaWeb监听器_javaweb 监听器-CSDN博客

监听器是Servlet规范中定义的一种特殊类,简单来说就是监听操作

  • 用来监听ServletContext、HttpSession和ServletRequest等域对象的创建和销毁事件
  • 用来监听域对象的属性发生修改的事件
  • 可以在事件发生前、发生后做一些必要的处理

2、使用 Listener 监听 Session 的创建、销毁

创建两个 Servlet:CreateSession、DestroySession

CreateSession 用来创建 Session:

DestroySession 用来销毁 Session:

创建一个 Listener:ListenSession,用来监听 Session 的创建、销毁

注意:配置 Listener 路由时不需要加路径,因为 Listener 不是以访问路径触发的

验证结果:

  • 访问 /cs 时,IDEA 控制台输出 "Listener监听到了Session创建",触发 Listener的 sessionCreated 方法
  • 访问 /ds 时,IDEA 控制台输出 "Listener监听到了Session销毁",触发 Listener的 sessionDestroyed 方法

3、Listen 监听器的安全场景

  • 代码审计中分析执行逻辑触发操作

  • 红队内存马植入,蓝队清理内存马等

Listen 在安全方面涉及的比较少,不像 Filter 涉及的比较多,但还是有这种类型的内存马。

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

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

相关文章

轻量级购物小程序H5产品设计经典样例

主要是看到这个产品设计的不错值得借鉴特记录如下&#xff1a; 不过大多数购物app都大致相同&#xff0c;这个算是经典样例&#xff0c;几乎都可以复制&#xff0c;我第一次使用&#xff0c;感觉和顺畅。看上去产品是经过打磨的&#xff0c;布局非常好。内容也很丰富。支持异业…

强大的电子书阅读器:OmniReader Pro for mac

&#x1f50d; OmniReader Pro 是一款专为 Mac 设计的强大阅读工具&#xff0c;它能够帮助你更高效地阅读和处理各种文本内容。无论是电子书、新闻文章、网页文本还是文件资料&#xff0c;OmniReader Pro 都能胜任&#xff01; ✅ OmniReader Pro 提供了丰富的功能&#xff0c…

如何在华为云上购买ECS及以镜像的方式部署华为云欧拉操作系统 (HCE OS)

写在前面 工作中遇到&#xff0c;简单整理博文内容为 华为云开发者认证 实验笔记https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在…

时序图聚类关联算法

时序图聚类关联算法 A time resolved clustering method revealing longterm structures and their short-term internal dynamics 一种揭示长期结构及其短期内动力学的时间分辨聚类方法 arxiv2019 源码&#xff1a; https://github.com/t4d-gmbh/MajorTrack/tree/master https…

k8s集群内部署nexus

一、前言 在k8s集群中部署nexus服务需要使用到pv、pvc服务来存储nexus的数据&#xff0c;需要使用service服务来提供对外访问nexus服务的端口&#xff0c;需要使用deployment服务来管理nexus服务&#xff0c;接下来就是用这些服务来在k8s集群中搭建nexus&#xff0c;pv服务使用…

elementui中的el-table,当使用fixed属性时,table主体会遮挡住滚动条的大半部分,导致很难选中。

情况&#xff1a; 解决&#xff1a; table加个类&#xff0c;这里取为class"table" 然后是样式部分&#xff1a; <style scoped lang"scss"> ::v-deep.table {// 滚动条高度调整::-webkit-scrollbar {height: 15px;}// pointer-events 的基本信息…

Manacher算法(马拉车)

Manacher&#xff08;马拉车&#xff09;算法 作用&#xff1a;在On的时间复杂度下&#xff0c;求出字符串每个回文中心的最长回文半径 回文半径&#xff1a;以回文中心为起点&#xff0c;到回文串两端的距离 如&#xff1a;# a # b # a # 以b为回文中心&#xff0c;最长回文半…

windows安装conda小环境 windows安装anaconda python jupyter anaconda

windows安装anaconda之后&#xff0c;再安装本地的jupyter 1 如果想体验在线版的jupyter&#xff0c;可以访问anaconda在Anaconda Cloud&#xff0c;需要注册github&#xff1a; 1 下载anaconda &#xff0c;并安装 1.1 下载 或者去清华镜像下载 Free Download | Anacondah…

python案例教程,python简单案例

这篇文章主要介绍了python案例教程&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 据说Python之父-Guido Van Rossum打算让CPython更快&#xff0c;速度直接翻五倍&#xff0c…

C# Tcplistener,Tcp服务端简易封装

文章目录 前言相关文章前言设计代码简单使用运行结果 前言 我最近有个需求要写Tcp服务端&#xff0c;我发现Tcp服务端的回调函数比较麻烦&#xff0c;简化Tcp的服务&#xff0c;我打算自己封装一个简单的Tcp服务端。 相关文章 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient…

Linux本地搭建StackEdit Markdown编辑器结合内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用 引言 在前面几期&#xff0c;介绍了敏感性分析法&#xff0c;本期来介绍lstm作为代理模型的sobol全局敏感性分析模型。 【MATLAB第31期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理回归问题MATLAB代…