【Java安全】基础配置篇-01

news2024/12/23 9:31:02

Java安全-01

文章目录

  • Java安全-01
    • 前置基础
    • 小demo开发记录
      • 文件上传
    • 课程学习记录
    • 初始配置阶段
      • 0x00 微服务阶段历史
      • 0x01 第一个SpringBoot程序
      • 0x02 原理初探
      • 0x03 SpringBoot配置文件
      • 0x04 给属性赋值的几种方法
      • 0x05 JSR303校验
      • 0x06 多环境配置
      • 0x07 再探自动配置原理
    • 开发阶段
      • 0x00 SpringBoot Web开发
        • 首页和图标定制
      • 0x01 模版引擎
      • 0x02 Thymeleaf语法
      • 0x03 SpringMVC配置原理

前置基础

基于SpringBoot框架展开开发,首先要了解一下整个项目的分层结构

从上到下:

  • 客户端界面:表现层 UI层 界面层
  • 服务层/业务层:直接为客户端提供的服务或功能
  • 领域层:系统内的领域活动
  • DAO层:数据访问对象,通过领域实体对象操作数据库

实战代码结构:

image-20240714014715347

其实最外层主要分为两块:

  • java目录:主要存放Java代码
  • resources目录:主要存放静态资源文件,如html、js、css等

进入到内层:

image-20240714015540046

  • Java下:
    • annotation:放置项目自定义注解
    • Controller:存放控制器,接收从前端传来的参数,负责对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理
    • dao层:数据访问层,与数据库进行交互,负责数据库操作,在Mybites框架中存放自定义的Mapper接口
    • entity:存放实体类
    • interceptor:拦截器
    • service:存放服务类,负责业务模块逻辑处理,其中包含两层:一是Service,用来声明接口;二是ServiceImpl,作为实现类实现接口中的方法
    • utils:存放工具类
    • dto:存放数据传输对象(Data Transfer Object), 如请求参数和返回结果
    • vo:视图对象(View Object)用于封装客户端请求的数据,防止部分数据泄露,保证数据安全
    • constant:存放常量
    • filter:存放过滤器
  • resources目录下
    • mapper:存放Mybites的mapper.xml文件
    • static:静态资源文件目录(JavaScript、CSS、图片),在这个目录中所有文件可以被直接访问
    • template:存放模板文件
    • application.properties:Spring Boot默认配置文件

image-20240714105150398

这里的API层 就相当于Controller层

  • 解释一下Controller和Service之间的区别

Controller层只会从前端接收数据,然后进行数据转发到Service层,不做具体的操作

image-20240714130114731

一些参数的判断验证,在Controller层进行验证,比如想上传文件的话,可以先在Controller层验证文件名后缀


小demo开发记录

文件上传

为了方便整个系统的开发,我们要规范化文件上传的接口,放在Service层中,保证可以在任何界面都可以去调用并进行上传

首先是Controller层

package com.example.thymeleaf.controller;

import com.example.thymeleaf.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@RestController
@RequestMapping("/upload")
public class UploadController {
    //解释一下自动装配的功能:使得控制器类能够使用服务类的方法而无需手动创建服务类的实例
    @Autowired
    private UploadService service;

    @GetMapping
    public String showUploadForm() {
        return "<!DOCTYPE html>"
                + "<html><head><title>File Upload</title></head>"
                + "<body><h1>Upload a File</h1>"
                + "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"/upload\">"
                + "<input type=\"file\" name=\"file\" />"
                + "<button type=\"submit\">Upload</button>"
                + "</form></body></html>";
    }

    @PostMapping
    public String handleFileUpload(@RequestParam("file") MultipartFile file,
                                   RedirectAttributes redirectAttributes) {

        try {
            String fileName = service.uploadFile(file);
            return "You successfully uploaded '" + fileName + "'";

        } catch (IOException e) {
            e.printStackTrace();
            return "Failed to upload '" + file.getOriginalFilename() + "'";
        }
    }
}

路径是/upload 直接访问是get请求 会展示表单

image-20240714164942666

点击upload上传文件,是post请求 会上传文件

Service层:

package com.example.thymeleaf.service;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

public interface UploadService {

    String uploadFile(MultipartFile file) throws IOException;

}

具体方法实现:

package com.example.thymeleaf.service.impl;

import com.example.thymeleaf.service.UploadService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Service
public class UploadServiceImpl implements UploadService {
    @Value("${file.upload-dir}")
    private String uploadDir;

    @Override
    public String uploadFile(MultipartFile file) throws IOException{
        if(file.isEmpty()){
            throw new IOException("Failed to upload empty file.");
        }
        File dest = new File(uploadDir + "/" + file.getOriginalFilename());
        file.transferTo(dest); //将上传的文件保存到指定的目标文件。

        return file.getOriginalFilename();
    }

}

其中记得在配置文件中指定一下目录

image-20240714165304202


课程学习记录

初始配置阶段

学习守则:学一个东西前,先自己列一个学习路线,有目标有方向一步一步来

image-20240714195514823

0x00 微服务阶段历史

all in one:所有功能

微服务架构:把功能进行分区存储,对某个功能

了解Spring家族:

image-20240715135749019

Spring Boot:构建一切

Spring Cloud:协调一切

Spring Cloud Data Flow:连接一切

0x01 第一个SpringBoot程序

玩一下,修改banner

https://www.bootschool.net/ascii-art/search

image-20240715202451661

在source目录下 创建banner.txt文件即可

image-20240715202521957

6 成功了

0x02 原理初探

自动配置:

pom.xml:

  • Spring-boot-dependencies:核心依赖在父工程中
  • 在引入Springboot依赖 不需要指定版本 因为有些版本仓库

启动器:

  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    starter后面指定场景,上面这个就会棒我们自动导入web环境所有的依赖

主程序:

//@SpringBootApplication : 解释一下这个注解 这个是标注这个是Springboot的一个应用  如果没有 直接整个崩掉
// 作用就是:启动类下的所有资源被导入 
@SpringBootApplication
public class BeginnerApplication {

    public static void main(String[] args) {
        //将Springboot启动
        SpringApplication.run(BeginnerApplication.class, args);
    }

}

解释一下其中的注解,点进去读源码

image-20240715204554680

  • 注解
@SpringBootConfiguration : Springboot的配置
		@Configuration:  spring配置类
		@Component : 说明这是一个spring的组件
		
@EnableAutoConfiguration : 自动配置
		@AutoConfigurationPackage : 自动配置包
			@Import({Registrar.class}) : 导入选择器   注册
		@Import({AutoConfigurationImportSelector.class})

0x03 SpringBoot配置文件

一般操作 首先删除自动生成的application.properties

然后新建一个配置文件application.yaml 修改下后缀 名字不需要改变

介绍一下两者的区别:

  • application.properties
    • 语法结构:key=value
  • application.yaml
    • 语法结构:key: value (注意这个地方在冒号后面有一个空格)

yaml基础语法:

#普通的key-value
name: qinjing


#对象
student:
	name: qinjiang
	age: 3
	
#行内写法
student: {name: qinjiang,age: 3}

#数组  两个空格
pets:
  - cat
  - dog
  - pig
   
pets: [cat, dog, pig]

之所以使用yaml 是因为可以给实体类赋值

0x04 给属性赋值的几种方法

首先可以使用注解

image-20240717122821132

来test里面测试一下

image-20240717122909837

第二种方法:在yaml配置文件中赋值 核心

image-20240717124728668

注意之所以能注入成功,还需要设置一些配置

image-20240717124822562

上面爆红 不影响工作 这是去yaml中找person 去注入数据

可玩性:直接写一些占位符

image-20240717130911915

image-20240717131104680

表达式

image-20240717131933152

如果前面这个参数存在 则读取参数 否则直接是hello

image-20240717132045472

image-20240717132034140

松散绑定:

image-20240718133015787

注意一下就好 以后看yaml文件 如果看到横杠分隔 知道怎么个事就好


第三种方法 配置properties

image-20240717130601189

image-20240717130631007

嘿嘿 成功

image-20240717130651774

properties防止乱码小技巧:

image-20240717124658627

0x05 JSR303校验

在字段加一层过滤器验证,保证数据的合法性

使用方法

image-20240718163345769

注意一定要在pom文件中配置

<!--验证数据的依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

可以修改默认报错语句

image-20240718163715176

image-20240718163637171

jsr303 校验语句

image-20240718163909131

0x06 多环境配置

在配置application.properties时 有默认环境 测试环境 上线环境 但是逐个修改很麻烦 可以直接进行多环境配置

image-20240718173542268

下面凸显yaml的多文档模式的便捷

image-20240718173802610

分割线就是划分文件

0x07 再探自动配置原理

学这个的目的 是让我们更会写内容 在思考中写配置 而不是看文档背

image-20240718180546610

image-20240718181340719

遇到什么 看什么 配置就是在pom中加一个starter启动即可

开发阶段

0x00 SpringBoot Web开发

目录结构:

在resources中 static放静态资源 templates放模版

image-20240718202358168

导入静态资源

image-20240718204301920

前提引入maven

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.4.1</version>
</dependency>

访问成功拿下

image-20240718204420465

  • 探索哪些可以直接被访问到

image-20240718205659267

image-20240718205750246

成功访问public文件夹下的内容 注意: 优先级 按这个顺序 第一个就是在当前目录下 第二个指还可以创建一个resources文件夹

image-20240718205842027

一般习惯:

  • public:大家公共访问的资源
  • resources:upload大家上传的资源
  • static:index.html首页 + 静态资源 比如图片之类的
  • templates:所有该目录下的文件 只能通过Controller来

总结:

  1. 在Springboot,我们可以使用以下方式处理静态资源
    • webjars localhost:8081/webjars/ 这个方式不推荐
    • public static /** resources localhost:8081/
  2. 要学会读源码 因为技术在不断更新 不能全靠老师 上面的文件目录就来自于源码的读取
首页和图标定制

首页 index.html

image-20240718212328379

直接访问 非常完美

image-20240718212425277

0x01 模版引擎

  • 概念

先解释一下这个东西的作用

image-20240718234402052

简单来说就是在前端界面预留位置 然后结合后端的数据 进行渲染 生成最终呈现给用户的界面

  • 常见引擎

jsp

freemarker

Thymeleaf

  • 常用Thymeleaf使用

导入依赖

<!-- Thymelead  基于3.x开发-->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>

默认放在templates目录下 后缀名是html

image-20240719083421574

结论:

只要需要使用thymeleaf 只需要导入对应的依赖就可以

我们将html放在templates目录下即可

使用方法如下:在Controller层引过去

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello, world!";
    }
}

此外一定要掌握钻研 读源码的本领 要不然就会被直接公司招新人 你就被淘汰

声明命名空间 在html文件中 添加后面这一句xm…

<html lang="en" xmlns:th="http://www.thymeleaf.org">

所有的html元素都可以被thymeleaf接管: 即th:元素名

小demo:

Controller层:

image-20240719151742665

html:

image-20240719151917167

效果:

image-20240719151934872

0x02 Thymeleaf语法

取变量:${…}

取URL:@{…}

文本转义:text

不转义:utext

demo:

image-20240719152341702

image-20240719152408370

效果:image-20240719152426796

检查一下网页代码 可以发现尖括号被转义了 这也就提供了防范xss的思路

image-20240719152522895

  • 遍历

首先在Controller层中写个数组

model.addAttribute("users", Arrays.asList("happySu", "is", "your dad"));

然后再html中修改一下 提供两种赋值方法

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>111</h1>
<div th:text="${msg}"></div>
<div th:utext="${msg}"></div>

<!--方法一: ${}都是在取变量的值  这是循环遍历users变量 赋值给user  先遍历出来  然后后面text取值 取刚刚遍历出来的变量user的值进行输出-->
<h3 th:each="user:${users}" th:text="${user}"></h3>

<!--方法二: 行内输出  两个中括号包裹起来就行-->
<h3 th:each="user:${users}">[[ ${user} ]]</h3>
</body>
</html>

效果

image-20240719153357118

0x03 SpringMVC配置原理

@Configuration注解:表示是一个配置类

总结:在Springboot中,有非常多的xxxConfiguration帮助我们进行扩展配置 看到后要注意嗷


学完基础的一点内容,后面展开一个项目的整体开发,期待吧~

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

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

相关文章

勒索软件运营商的恶意软件

ARC Labs 发现并分析了一种用于Qilin勒索软件攻击的新工具。 这种恶意软件被称为“Killer Ultra”&#xff0c;旨在禁用流行的威胁检测和响应&#xff08;EDR&#xff09;以及防病毒软件。 ARC Labs 专家进行了深入分析&#xff0c;以了解 Killer Ultra 的全部功能&#xff0…

新品发布|全面适配鸿蒙NEXT安全检测,助力鸿蒙安全生态建设

鸿蒙系统打破了移动操作系统两极格局&#xff0c;实现操作系统核心技术的自主可控、安全可靠&#xff0c;在神州大地上掀起一波科技革新的浪潮&#xff0c;HarmonyOS NEXT成为大型企业必须要布局的应用系统之一&#xff0c;如何检测鸿蒙应用的安全性是企业内部的核心难点之一&a…

C++基础语法:STL之容器(4)--序列容器中的list(一)

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上. 序列容器回顾:序列容器内元素按严格…

加密软件有什么用?五款电脑文件加密软件推荐

加密软件对于个人和企业来说至关重要&#xff0c;尤其是在2024年这样一个高度数字化的时代&#xff0c;数据安全变得尤为重要。 数据保护&#xff1a;加密软件可以保护敏感信息不被未经授权的人访问。这包括个人数据、财务记录、健康信息、企业机密等。 防泄漏&#xff1a;防…

组合数学+费用背包+刷表,G2 - Playlist for Polycarp (hard version)

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 G2 - Playlist for Polycarp (hard version) 二、解题报告 1、思路分析 一…

Linux驱动开发-05APP和驱动的交互方式

一、传输数据 APP和驱动: copy_to_usercopy_from_user驱动和硬件: 各个子系统的函数通过ioremap映射寄存器地址后,直接访问寄存器二、APP使用驱动的四种方式 驱动程序:提供能力,不提供策略 非阻塞(查询)(应用程序访问底层驱动时(read、write时),驱动没有数据不等待,…

【Vue】深入理解 `v-model` 指令:实现数据双向绑定的终极指南

文章目录 一、v-model 指令概述二、v-model 的基本用法1. 绑定输入框的值2. 绑定多行文本框的值3. 绑定复选框4. 绑定单选框5. 绑定选择框 三、v-model 的工作原理四、v-model 的高级用法1. 自定义组件中的 v-model模板部分 (<template>)脚本部分 (<script>) 2. 多…

vue项目源码调试方法 ,chrome调试控制台工作区使用,利用chrome控制台调试vue项目源码的方法 图解

我们在开发vue项目的时候&#xff0c;项目开始后的第一件事情应该就是准备调试工作了&#xff0c;Chrome调试控制台就给我们提供了这样的一个方便的调试工作区。方法为&#xff0c;在Chrome浏览器里面打开你要调试的页面&#xff0c;然后打开调试控制台&#xff0c;如下&#x…

基于STC8H4K64TL单片机的触摸功能和数码管驱动功能实现一个触摸按键单击长按都增加数值另一个触摸按键单击长按都减少数值应用

基于STC8H4K64TL单片机的触摸功能和数码管驱动功能实现一个触摸按键单击长按都增加数值另一个触摸按键单击长按都减少数值应用 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单…

【Linux】汇总TCP网络连接状态命令

输入命令&#xff1a; netstat -na | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]} 显示&#xff1a; 让我们逐步解析这个命令&#xff1a; netstat -na: netstat 是一个用于显示网络连接、路由表、接口统计等信息的命令。 -n 选项表示输出地址和端口以数字格式显示…

ACCL+: an FPGA-Based Collective Engine for Distributed Applications——论文泛读

OSDI 2024 Paper 论文阅读笔记整理 问题 FPGA在云部署中越来越普遍[16,81]&#xff0c;如智能NIC[29,35,64,67103]、流处理器[31,32,55,68]和分布式加速器[15,41,61,65,86,93115]。可以使用FPGA到FPGA的直接通信来构建高效的分布式系统。然而&#xff0c;使用FPGA设计分布式应…

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代&#xff0c;流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台&#xff0c;它不仅简化了实时数据处理流程&#xff0c;还免去了服务器管理的烦恼&#xff0c;提升了效率。本文将指导您使用EMR Serverless Spark…

python爬虫获取网易云音乐评论歌词以及歌曲地址

python爬虫获取网易云音乐评论歌词以及歌曲地址 一.寻找数据接口二.对负载分析三.寻找参数加密过程1.首先找到评论的请求包并找到发起程序2.寻找js加密的代码 四.扣取js的加密源码1.加密函数参数分析①.JSON.stringify(i0x)②bse6Y(["流泪", "强"])③bse6Y…

Linux--Socket套接字编程

Socket编程 Socket编程是一种在网络中不同计算机之间实现数据交换的编程方式。它允许程序创建网络连接&#xff0c;并通过这些连接来发送和接收数据。Socket编程是网络编程的基础&#xff0c;广泛应用于客户端-服务器&#xff08;C/S&#xff09;架构中。 要实现双方通信&…

【扩散模型(六)】Stable Diffusion 3 diffusers 源码详解1-推理代码-文本处理部分

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视…

基于python的去除图像内部填充

1 代码功能 该代码实现了一个图像处理的功能&#xff0c;具体来说是去除图像内部填充&#xff08;或更准确地说&#xff0c;是提取并显示图像中轮廓的外围区域&#xff0c;而忽略内部填充&#xff09;。以下是该功能的详细步骤&#xff1a; 读取图像&#xff1a;使用cv2.imread…

Hadoop-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBaseRedis 章节内容 上一节我们完成了&#xff1a; HBase …

机器学习-18-统计学与机器学习中回归的区别以及统计学基础知识

参考通透!一万字的统计学知识大梳理 参考3万字长文!手把手教你学会用Python实现统计学 参考统计学的回归和机器学习中的回归有什么差别? 1 研究对象 一维:就是当前摆在我们面前的“一组”,“一批数据。这里我们会用到统计学的知识去研究这类对象。 二维:就是研究某个“事…

【系统架构设计】数据库系统(三)

数据库系统&#xff08;三&#xff09; 数据库模式与范式数据库设计备份与恢复分布式数据库系统分布式数据库的概念特点分类目标 分布式数据库的架构分布式数据库系统与并行数据库系统 数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 备份与恢复 分布式数据库系统…

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…