freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

代码审计学习-3(JavaEE学习中的思考)
2024-04-23 15:14:07

前言

主要是记录自己在学习JavaEE中遇见的问题以及思考,还有一些知识点。

1.JavaEE与JavaSE的区别

前两次的学习,知道JavaSE和JavaEE就是青春版和专享版(手动狗头),当然,这是开玩笑的,JavaEE就是企业版。但是一直没说这个区别在那,今天简单记录一下。

以下是JavaSE和JavaEE的主要区别:

  • 定位:JavaSE是Java技术的核心和基础,适用于各种环境和应用场景;而JavaEE是Java技术面向企业级应用的扩展,专注于解决企业级应用的问题。
  • 功能:JavaSE提供了Java语言的基本实现,包括面向对象编程、多线程、IO流等核心功能;而JavaEE则在此基础上增加了Web服务、分布式事务处理、安全性、消息传递等面向企业级应用的功能。
  • 应用场景:JavaSE适用于桌面、服务器、嵌入式设备和实时环境等各种应用场景;而JavaEE则更适用于构建大型、复杂的企业级应用,如电子商务网站、企业管理系统等

JavaEE(Java Platform, Enterprise Edition)是Java平台的企业版,建立在JavaSE之上,为开发大型、分布式、可扩展的企业级应用提供支持。它包含了JavaSE的所有功能,并且还提供了一系列的API和服务,如Servlet、JSP、EJB、JMS等,用于开发Web应用、企业级应用服务器等。

说人话就是针对企业做了相对应的功能添加与优化。

2.MVC

2.1什么是MVC?

很久之前听过MVC架构,但当时并没有深入去了解其原理,这次学习完了总结一下。上期的Javaweb其实较远古版本是较为优秀的,但是发展下来需求功能越来越多,就造成了开发复杂 ,代码耦合性过高,维护起来成本太高了。因此就有了 新的开发思想,来个地基(架构),上面盖房子(开发)。速度快了,维护起来也方便。

接下来简单介绍下。

MVC架构,即Model(模型)-View(视图)-Controller(控制器)架构,是一种软件设计规范,主要用于组织代码,实现业务逻辑、数据和显示的分离。这种架构模式通过将应用程序的不同部分划分为三个主要组件,使得代码更加模块化、可维护,并且提高了代码的可重用性和可扩展性。

在MVC架构中,每个组件都有其特定的职责:

  • 模型(Model):负责处理数据和业务逻辑。它包含数据和状态信息,以及处理这些数据的方法。模型不关心视图或控制器的具体实现,它只关注数据的处理。
  • 视图(View):负责数据的展示,即用户界面。视图从模型获取数据,并将其以可视化的方式呈现给用户。视图不直接处理业务逻辑或数据,它只是将数据展示给用户。
  • 控制器(Controller):作为模型和视图之间的协调者,负责接收用户的输入,根据输入调用相应的模型进行处理,并将处理后的数据传递给视图进行展示。控制器不处理数据或业务逻辑,它只是根据用户的输入和模型的状态来调度视图和模型之间的交互。

MVC架构的优点在于其低耦合性、高重用性、快速部署以及高可维护性。通过将应用程序的不同部分分离,MVC架构使得每个组件都可以独立开发和测试,降低了代码的复杂度,提高了开发效率。同时,由于模型、视图和控制器之间的松耦合,使得在需要修改或添加新功能时,只需关注特定的组件,而不会影响到其他部分的代码。

总之,MVC架构是一种有效的软件设计模式,它通过将应用程序划分为模型、视图和控制器三个组件,实现了业务逻辑、数据和显示的分离,提高了代码的可维护性、可重用性和可扩展性。

举个例子,还是过红灯吧,红灯信号变绿(view),大脑(controller)匹配过红灯的行为模式,绿灯了(model),大脑(controller)控制我们完成过马路。如果大脑(controller)发现是红灯(view),则会原地等待(model)。为了更好理解这个,简单举例,有不对的地方或者理解偏差的地方,欢迎大家指正哈!谢谢了。

2.2Model

在MVC(Model-View-Controller)模式中,Model(模型)是应用程序的核心部分,它代表业务数据和业务逻辑。模型通常包括数据访问对象、实体类和业务逻辑类等,它处理数据并提供业务规则。模型的主要职责是管理应用程序的数据状态和业务逻辑,但它并不直接处理用户界面或用户输入。模型可以为多个视图提供数据,提高代码的可重用性。

MVC模式将应用程序的业务逻辑、用户界面和用户输入分离开来,使得代码更易于维护、测试和扩展。通过Model,我们可以更专注于业务逻辑和数据处理,而将视图和控制器分别用于用户界面显示和用户交互处理,从而实现模块化的开发方式。

总的来说,MVC中的Model是应用程序数据处理和业务逻辑的核心,它与其他两个组件(视图和控制器)协同工作,共同实现应用程序的功能。

简单来说Model就是一种处理模型,我个人觉得它最最主要的作用还是对数据库数据的具体操作逻辑。数据的DAO层,就是负责底层数据库链接的那层。

2.3View

在MVC(Model-View-Controller)模式中,View(视图)主要负责显示应用程序的用户界面,是用户与之交互的界面层。它呈现从模型获取的数据,并根据控制器的指示来更新显示。

视图通常是由HTML、CSS和JavaScript等前端技术构建的网页或用户界面组件。它根据模型提供的数据来生成相应的输出,如文本、图像、图表等。视图不仅显示数据,还可以响应用户的交互事件,例如按钮点击、表单提交等,并将这些事件传递给控制器处理。

在MVC模式中,视图与模型和控制器保持松耦合的关系。视图不直接访问或修改模型中的数据,而是通过控制器来获取数据和发送更新请求。这种分离使得视图可以更加专注于用户界面的呈现和交互逻辑,而不需要关心数据处理和业务逻辑的实现细节。

总结来说,MVC中的View是应用程序的用户界面层,负责显示数据和响应用户交互,与模型和控制器协同工作,实现应用程序的整体功能。

个人理解就像一个人的外在体现,经常看的web界面就是我们常说的View,主要就是我们在使用程序作为程序使用者接触的这些东西。

2.3Controller

在MVC(Model-View-Controller)模式中,Controller(控制器)担任着协调模型和视图之间交互的关键角色。它接收用户的输入,如点击按钮或提交表单,并基于这些输入来决定如何更新模型和视图。

控制器的工作流程通常如下:

  • 接收用户输入:控制器首先接收来自视图的用户输入或请求。
  • 与模型交互:基于用户输入,控制器会与模型进行交互。这可能包括从模型中检索数据、更新模型的状态或调用模型的业务逻辑方法。
  • 选择视图:控制器根据模型的状态和用户的请求,决定使用哪个视图来展示数据。
  • 发送数据给视图:控制器将模型中的数据传递给视图,以便视图能够正确地呈现这些信息。
  • 更新视图:视图基于从控制器接收到的数据和指令进行更新。这可以是简单的数据渲染,也可以是复杂的用户界面的变换。

控制器在MVC架构中起到了桥梁的作用,它确保模型和视图之间的通信是解耦的。这意味着模型和视图可以独立地进行修改和扩展,而不需要对彼此的代码进行大量的更改。

通过这种方式,MVC模式促进了应用程序的可维护性、可测试性和可扩展性。控制器专注于处理用户请求和协调模型与视图之间的交互,从而使得应用程序的逻辑更加清晰和模块化。

简单理解就是,我们常常说的“逻辑”,这个就是程序运行的逻辑。

3.Spring

3.1什么是Spring

Spring是一个轻量级的开源框架,主要用于简化Java开发。它提供了IoC(控制反转)容器和AOP(面向切面编程)框架,使得企业级应用的组件化开发变得更加简单、灵活、可维护。Spring框架的主要用途包括Web开发、数据持久化、事务管理以及整合其他技术等。

具体来说,IoC容器是Spring框架的核心功能之一,它负责对象的生命周期管理并自动注入依赖项,减少了手动编码的需求。AOP支持则允许开发者在不修改原有代码的情况下实现横切关注点,如数据验证、安全性等。Spring还提供了一系列的Web开发功能,如Spring MVC,用于简化Web应用程序的开发工作。同时,Spring支持多种持久化技术,如JPA、Hibernate、MyBatis等,可以轻松地实现数据持久化。

此外,Spring框架的轻量级特性使其仅依赖于少数几个第三方库,可以轻松地集成到现有的Java应用程序中。同时,Spring还支持模块化开发,可以按需选择需要的功能模块进行集成。

综上,Spring是一个功能强大且灵活的框架,它通过简化Java开发过程,提高了应用程序的可维护性和可扩展性。说人话就是我们说的程序的“地基”。在“地基”上面“盖房子”(开发)。

3.2IoC

单独写IoC是因为这个概念挺有意思的。

IoC,即控制反转(Inversion of Control),是一种设计思想,而不是具体的技术。它主张将对象的创建、初始化、销毁等控制权交由专门的容器(如Spring的IoC容器)来管理,而不是由开发者在代码内部直接控制。这种设计思想的核心目的是降低代码的耦合度,提高系统的灵活性和可维护性。

具体来说,IoC通过依赖注入(Dependency Injection)和依赖查找(Dependency Lookup)的方式来实现控制反转。依赖注入是指由IoC容器来负责将依赖的对象注入到需要它们的对象中,而不是由对象自己通过new或其他方式创建。依赖查找则是指IoC容器可以根据需要来查找和装配对象之间的依赖关系。

在Java开发中,IoC意味着将开发者设计好的对象交给容器控制,而不是在对象内部直接控制。这使得对象与对象之间是松散耦合的,利于功能复用,也使得整个程序的体系结构变得非常灵活。

Spring框架是一个很好的IoC容器实现,它提供了多种方式来管理对象及其依赖关系,如构造方法注入、属性注入等。通过使用Spring框架,开发者可以更加专注于业务逻辑的实现,而不需要过多关注对象的创建和管理。

简单说就是将一些功能由代码控制交给容器来控制,不需要进行具体代码编写了,只需要写好标记,容器会进行管理。

3.3Bean

之前一直搞不清什么是Bean对象,趁着现在记忆还热乎,感觉记录下来。

在Java开发中,Bean对象主要是指JavaBean。JavaBean是一种特殊的Java类,它遵循特定的规则,包括执行java.io.Serializable接口、提供无参数的构造器以及提供getter和setter方法访问它的属性。简而言之,JavaBean是用Java语言描述的软件组件模型,其实际上是一个类,这些类遵循一个接口格式,以便于使函数命名、底层行为以及继承或实现的行为标准化。

JavaBean的主要作用是封装数据,并提供对这些数据的访问和操作方法。通过使用JavaBean,我们可以将相关的属性和方法组织在一起,使代码更加清晰和易于维护。

在Spring框架中,Bean对象的概念得到了进一步的扩展和应用。Spring框架中的Bean是由IoC容器实例化、配置和管理的对象。Spring使用Bean来组织和管理应用程序中的各个组件,并通过依赖注入的方式将这些组件关联起来。Spring Bean可以是任何普通的Java对象,只要它们符合Spring Bean的规范,就可以被Spring容器管理和使用。

简单来说就是,IoC对象实例,具体来管理一些对象的“管理员”。

4.Struct2

刚才说的Spring是MVC框架,偏向于开发,也就是MVC中的MC,而Struct2则是偏向MV。

Struts2相较于传统的MVC模式,具有一些显著的优势。这些优势使得Struts2成为Web应用开发中一种受欢迎的选择。

  • 首先,Struts2框架基于MVC设计模式,但它在MVC的基础上进行了扩展和优化。Struts2将模型、视图和控制器三者更紧密地结合在一起,提供了一种更为整洁和高效的MVC实现方式。这使得开发者能够更轻松地组织和管理代码,提高开发效率。
  • 其次,Struts2框架具有灵活的配置和定制化开发能力。它允许开发人员通过配置文件来定义各个组件之间的关系和行为,实现灵活的配置和定制化开发。这使得开发者能够根据自己的需求快速搭建和修改应用程序,满足不同的业务需求。
  • 此外,Struts2框架提供了丰富的标签库和工具类,使得页面开发更为简单和高效。开发人员可以使用这些标签和工具类来生成HTML表单、处理数据验证、显示数据等,简化了页面开发的过程。
  • 另外,Struts2框架还内置了国际化支持,可以方便地实现多语言环境的切换。在配置文件中,可以定义多个语言的资源文件,根据用户的语言环境自动切换显示相应的资源。
  • 此外,Struts2框架还支持与多种其他框架(如Spring、Hibernate等)的整合使用。这使得开发者能够利用这些框架的优势,实现更为复杂和强大的Web应用程序。
  • 最后,Struts2框架还具有较好的性能和可扩展性。它使用值栈等技术来管理数据,避免了过多的性能损耗。同时,Struts2框架的模块化设计使得开发者能够按需选择所需的功能模块,实现灵活的功能扩展。

综上所述,Struts2相较于传统的MVC模式,在灵活性、配置定制化、页面开发、国际化支持、与其他框架的整合以及性能和可扩展性等方面具有优势。这使得Struts2成为Web应用开发中一种高效、可靠且灵活的选择。

我个人觉得这玩意更加偏向View,可能是整合的原因,更加侧重于这块。但是不是说不能单独用啊,Spring和Struct2都可单独使用,各有各的优点,结合起来会更加强大。

5.Hibernate和MyBatis

Hibernate和MyBatis都是Java中流行的ORM(对象关系映射)框架,它们各有优势和劣势,适用于不同的场景和需求。下面将对这两个框架的优缺点进行详细对比:

Hibernate的优缺点

优点:

  • 透明性:Hibernate通过自动映射Java对象到数据库表,使开发者无需关心底层SQL细节,可以专注于业务逻辑的开发。
  • 全自动:Hibernate提供了全自动化的持久化服务,如对象状态管理、事务处理等,降低了开发的复杂度。
  • 强大的查询能力:Hibernate支持HQL(Hibernate Query Language)和Criteria查询,提供了丰富的查询功能。
  • 移植性好:Hibernate支持多种数据库,通过修改配置文件即可轻松切换数据库。

缺点:

  • 性能损耗:由于Hibernate提供了全自动化的服务,这可能会导致在某些情况下性能不如手动编写的SQL。
  • 学习成本高:Hibernate的API和功能较多,对于初学者来说可能需要一定的时间来学习和掌握。
  • 灵活度不足:在某些复杂的SQL查询或特定数据库操作上,Hibernate可能不如直接使用SQL灵活。

MyBatis的优缺点

优点:

  • 灵活性强:MyBatis允许开发者直接编写SQL,对于复杂的SQL查询或特定的数据库操作,可以提供更高的灵活性。
  • 易于优化:由于MyBatis直接操作SQL,开发者可以更容易地针对性能问题进行优化。
  • 轻量级:MyBatis的架构相对简单,没有Hibernate那样复杂的内部机制,因此更轻量级。
  • 集成性好:MyBatis可以很好地与Spring等框架集成,提供了良好的开发体验。

缺点:

  • SQL维护:由于MyBatis直接编写SQL,当数据库结构发生变化时,可能需要修改大量的SQL映射文件,维护成本较高。
  • 易错性:直接编写SQL可能导致SQL注入等安全问题,需要开发者注意SQL的安全性。
  • 自动化程度低:相对于Hibernate,MyBatis的自动化程度较低,需要手动管理对象的生命周期和事务。

总结:

Hibernate和MyBatis各有其优劣势,Hibernate更适合那些需要快速开发、高度自动化和良好移植性的项目;而MyBatis则更适合那些需要高度灵活性和自定义SQL的项目。

ORM,全称Object-Relational Mapping(对象关系映射),是一种编程技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。简而言之,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。上述说的Hibernate是全ORM,Mybaits是半ORM。

6.Shiro框架

6.1什么是Shiro

Shiro框架是一款轻量级的Java安全框架,提供了身份认证、授权、加密和会话管理等功能。它可以集成到任何Java Web应用程序中,并且易于使用和扩展。Shiro的设计理念是简洁而灵活,不仅可以应用于Web应用程序,还可以应用于命令行、移动设备和分布式系统等各种应用场景。

Shiro支持多种认证和授权方式,可以通过插件机制轻松集成到其他框架中,满足不同应用场景的需求。同时,Shiro还提供了丰富的扩展点和事件机制,可以进行各种自定义功能扩展,实现更灵活的应用。

在安全性方面,Shiro自带多种加密和安全算法,如密码散列、数字摘要等,可以保护应用程序中数据、身份、角色等信息的安全性和完整性。同时,Shiro还提供了防止XSS、CSRF等攻击的防御机制,保证了应用系统的安全可靠。

此外,Shiro还提供了易于理解的API,使开发人员能够快速、轻松地集成到任何应用程序中,实现用户的认证和授权功能。它支持细粒度的授权控制,可以对用户进行角色和权限的管理,确保用户只能访问他们有权限的资源。

总的来说,Shiro框架是一个功能强大、灵活可扩展且安全可靠的Java安全框架,适用于各种应用场景,为开发人员提供了简便易用的工具来保障应用程序的安全性。

简单概括下,就是一个安全类框架,功能偏安全侧,认证机制做的比较好。具体其实挺复杂的,大家可以自己去了解。

6.2权限五张表

我觉得比较重要的关于权限这块的知识,就是这五张表了。

认证的五张表通常指的是在权限管理系统中用于记录用户、角色、权限以及它们之间关系的数据库表。这五张表分别是:用户表、角色表、权限表、用户角色关系表以及角色权限关系表。

  • 用户表:用于存储用户的基本信息,如用户名、密码、联系方式等。
  • 角色表:用于定义系统中不同的角色,每个角色可能对应着不同的职责和权限。
  • 权限表:用于存储系统中的各种权限信息,例如对某个模块的读取、写入、删除等权限。
  • 用户角色关系表:用于记录用户与角色之间的关联关系,即哪个用户拥有哪个角色。
  • 角色权限关系表:用于记录角色与权限之间的关联关系,即哪个角色拥有哪些权限。

通过这五张表,可以方便地实现基于角色的访问控制(RBAC)模型,对用户进行细粒度的权限管理。在实际应用中,根据具体需求,可能还需要对表结构进行一定的调整和扩展。

请注意,不同的系统或框架可能会有不同的表设计和命名方式,上述五张表只是一个常见的示例。在实际项目中,应根据项目的具体需求和使用的技术栈来设计适合的数据库表结构。

这个是比较常见的权限结构了,做的不到位就会产生各种越权漏洞。

欧克,到这,再会。

# java # Java代码审计
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录