SpringBoot学习笔记(2)

news2024/9/29 14:27:56

1.静态文件访问

        使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可。

        如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。

1.1直接访问

        在application.properties中直接定义过滤规则和静态资源位置:

如果要在浏览器访问这张图片,路径默认为: http://localhost:8080/zzc.webp

1.2虚拟路径访问

可以统计加一个虚拟路径,例如:在application.properties中接入:

        spring.mvc.static-path-pattern=/images/**        

        即给图片接入了一个虚拟前缀,

在浏览器中输入网址:http://localhost:8080/images/zzc.webp

1.3自定义路径(了解)

创建java类、上传图片等会自动在target下创建class类

静态资源位置为classpath:/static/

demo中编写的java类(class)如下:

 

2.文件上传原理

        表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

        当表单的enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value。一定要把enctype类型改为form-data类型。

        当表单的enctype="multipart/form-data"时,其传输数据形式如下:

        Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

2.1SpirngBoot实现文件上传功能

        当表单的enctype="multipart/form-data"时,可以使用MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中。

编写类 FileUploadController:

package com.example.demo.contraller;


import com.sun.net.httpserver.HttpServer;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.coyote.http11.filters.SavedRequestInputFilter;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

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

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    //等价于:
    //@RequestMapping(value = "/uplload",method = RequestMethod.POST)
    public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {

        System.out.println(nickname);
        //获取图片的原始名称
        System.out.println(photo.getOriginalFilename());
        //获取图片路径
        System.out.println(photo.getContentType());
        //获取文件类型
        String path = request.getServletContext().getRealPath("/upload/");

        //获取web服务器的运行目录,因为这个web服务器最终要部署到Linux系统上去,放到云端上去
        //要求动态的获取到web服务器所在的位置
        //这个tomcat是我们IDEA自带的,若要运行在云端,那么tomcat也会运行到云端
        //因此定义了一个HttpServletRequest request参数,代表网络请求
        //String path = request.getServletContext().getRealPath("/upload/");
        //通过这个对象可以获取到上下文对象(web服务器),接着就可以获取其路径(.getRealPath)
        //request.getServletContext().getRealPath   前面这部分是动态获取的,
        //("/upload/")  后面这部分是不存在的,如果不存在那么就创建出来(后面函数有写的)

        System.out.println(path);

        saveFile(photo,path);
        //自定义一个方法,把文件存储起来
        return "上传成功";
    }

    private void saveFile(MultipartFile photo,String path) throws IOException{

        File dir = new File(path);
        if(!dir.exists()){
            dir.mkdir();

        }

        File file = new File(path + photo.getOriginalFilename());
        //该文件是最终存储的文件
        photo.transferTo(file);
    }
}

        获取web服务器的运行目录,因为这个web服务器最终要部署到Linux系统上去,放到云端上去;因此要求动态的获取到web服务器所在的位置。这个tomcat是我们IDEA自带的,若要运行在云端,那么tomcat也会运行到云端。因此定义了一个HttpServletRequest request参数,代表网络请求,String path = request.getServletContext().getRealPath("/upload/");通过这个对象可以获取到上下文对象(web服务器),接着就可以获取其路径(.getRealPath)

        request.getServletContext().getRealPath   前面这部分是动态获取的,("/upload/")  后面这部分是不存在的,如果不存在那么就创建出来(后面函数有写的)。

2.2上传文件

        注:使用form-data类型上传,且名称要对应起来。

运行和结果:

zhangzongchang
zzc.webp
image/webp
C:\Windows\Temp\tomcat-docbase.8080.626034175088608909\upload\
//动态路径+固定的\upload\ 如上:

自定义方法(存储文件)如下:

    private void saveFile(MultipartFile photo,String path) throws IOException{

        File dir = new File(path);
        if(!dir.exists()){
//        判断路径是否存在
            dir.mkdir();
//            若不存在就创建路径

        }

        File file = new File(path + photo.getOriginalFilename());
        //该文件是最终存储的文件
        //还要加上目录路径path和存储的文件名称photo.getOriginalFilename()
        photo.transferTo(file);
        //MultipartFile对象有一个transferTo()方法
        //该方法可以将网络上传输过来的文件存储到上面的文件目录(file)中去
    }

在pc上打开该目录:C:\Windows\Temp\tomcat-docbase.8080.626034175088608909\upload\

        但该目录不可以通过浏览器访问。 如果想要用户访问之前上传的头像文件,可以重新配置路径如下:spring.web.resources.static-locations=/upload/

        可以访问了:如下

3.拦截器

        拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:        

        权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。

         性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间

        通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。

3.1功能

        Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能

        HandlerInterceptor接口定义了preHandle(常用)、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作

 3.2拦截器的定义

例子:

重写父类里的方法: 

package com.example.demo.interceptor;

//import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;


    public class LoginInterceptor implements HandlerInterceptor {
        //继承了andlerInterceptor,重写了父类里的方法preHandle

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{
            //request参数对应前端的请求,response给前端返回信息
            System.out.println("LoginInterceptor");
            return true;
        }
}

3.3拦截器注册 

拦截器定义完成后还需要进行注册,否则不能使用。

        addPathPatterns方法定义拦截的地址

        excludePathPatterns定义排除某些地址不被拦截

        添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求

        如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。

在config包下: 

package com.example.demo.config;

import com.example.demo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
//为了让这个类生效,加一个注解@Configuration,有了这个世界springboot会自动读取这个类,下面的配置才会生效
public class WebConfig implements WebMvcConfigurer{
    //重写父类的方法

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        //一个增加拦截器的方法
        registry.addInterceptor(new LoginInterceptor());
        //

    }
}

3.4测试拦截器

        运行后访问之前的http://localhost:8080/hello

 这说明在访问http://localhost:8080/hello之前就已经进入到了拦截器内部了。

 

@Configuration
//为了让这个类生效,加一个注解@Configuration,有了这个世界springboot会自动读取这个类,下面的配置才会生效
public class WebConfig implements WebMvcConfigurer{
    //重写父类的方法

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        //一个增加拦截器的方法
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
        //代表只拦截/user/**里的

    }
}

刷新后发现已经不打印了,因为访问的是/hello

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

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

相关文章

在线远程考试|基于springBoot的在线远程考试系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 信息数据从传统到当代,是一直在变革当中,突…

增强免疫力的9种食物,秋冬尤其要多吃,营养美味又健康!

随着秋风渐起,冬日的脚步也越来越近!这时候,咱们的身体可是需要更多的关爱和呵护。说到秋冬养生,增强免疫力是头等大事。今天就来跟大家聊聊,那些既营养美味,又能帮我们提升免疫力的9种超级食物&#xff0c…

关于将inet引入的相关问题

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

Android 简单实现联系人列表+字母索引效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据,含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表,点击某个item,展示一个气泡组件(它会自动延时关闭), 左列表滚动并显示与点击的索引列表item …

UDS_1_基础知识

一. 概述 什么是UDS UDS: Unified Diagnostic Service, 统一诊断服务。 UDS是一个在整个汽车系统上经常使用的设备维护协议。其主要遵循:ISO-15765、ISO-14229 等协议。经常应用在整车的各种ECU上面。是一个在整车ECU应用层开发常用的协议之一。 UDS用途: 可以通过诊断…

【Python基础(二)】面向对象

学习分享 1、初始对象1.1、类的定义和使用1.2、类的私有成员和方法1.3、类的构造方法 2、继承的实现和属性的使用 1、初始对象 1.1、类的定义和使用 1.2、类的私有成员和方法 class Clock:id Noneprice Nonedef ring(self):import winsoundwinsound.Beep(2000,3000)clock Clo…

走近Z世代——感受约克VRF天氟地水中央空调营造的多重舒适体验

“我对于约克VRF中央空调最满意之处,就在于这个品牌对用户体验的极致追求。”来自浙江绍兴的范先生,在提到自家安装的约克VRF天氟地水中央空调时发出了如此感慨。作为“Z世代”的一员,年轻的范先生与所有95后年轻人一样,有着自身的独特审美需求,有对潮流的想法和坚持,更有着生活…

被问界/理想赶超!奔驰CEO再度“出马”,寻找中国外援

来自中国车企的全方位、持续施压,让大部分外资车企开始寻求更多的本地化合作来实现技术升级。传统豪华品牌也同样如此。 本周,知情人士透露,梅赛德斯奔驰首席执行官Ola Kllenius计划再次访问中国,目的是进一步寻求和扩大与本地技术…

矩阵系统源码搭建,OEM贴牌,源头技术开发

一、引言 矩阵系统在当今的数字化时代中发挥着重要的作用,无论是在社交媒体管理、内容分发还是数据分析等方面,都有着广泛的应用。本文将详细介绍矩阵系统源码搭建所需准备的内容,帮助开发者更好地理解和实施矩阵系统的搭建过程。 二、技术选…

集合框架 - Map双列集合

01 概述 02 常用方法 03 遍历方式 【快捷键】&#xff1a;ctrlaltv 【说明】&#xff1a;Map.Entry<xx,xx>中&#xff0c;Entry是Map集合中的一个接口&#xff0c;但接口是不能创建对象的&#xff0c;它底层是通过使用Entry的实现类对象来封装键值对数据的。 【说明】&a…

Transformer架构分析

1 encoder 每个称之为一个layer&#xff0c;重复N次 每个里面有两个sublayer&#xff1b;multi-head self-attention MLP后面使用layer normalization LayerNorm(x Sublayer(x)) 残差连接需要两个维度一致&#xff0c;本文采用513。 2 decoder 3 注意力机制 输出维度和val…

华为OD机试 - 匿名信(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

测试管理新增视图与高级搜索功能,测试计划支持一键生成缺陷详情,MeterSphere开源持续测试工具v3.3版本发布

2024年9月29日&#xff0c;MeterSphere开源持续测试工具正式发布v3.3版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;接口导入功能支持导入Postman、JMX、HAR和MeterSphere格式的文件&#xff0c;接口场景的自定义请求步骤支持cURL快捷导入&#xff1b;测试管理方面…

大数据实时数仓Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…

sql注入工具升级:自动化时间盲注、布尔盲注

项目地址&#xff1a;https://github.com/iamnotamaster/sql-injecter 给我之前写的sql注入脚本进行了一些升级&#xff0c;此文章就是对升级内容的分析&#xff0c;升级内容如下&#xff1a; 使用占位符foo来填充payload里需要经常修改的部分 自动判断循环 支持爆破和二分查…

UE4_Niagara基础实例—6、蓝图与粒子系统的通信

效果图&#xff1a; 分析&#xff1a; 通过键盘按键来修改粒子系统粒子的大小。 步骤&#xff1a; 1、粒子系统使用上一个实例的粒子系统&#xff0c;大体参数如下&#xff1a; 参数都是乱调的&#xff0c;自己可以随意设置&#xff0c;只注重方法而不在意好看&#xff0c;汗…

求5X5的次小值/次大值

我们知道&#xff0c;求最大值和最小值是比较容易的&#xff0c;就是通过分组判断&#xff0c;然后再次比较即可求出&#xff0c;那么求出次小值/次大值怎么实现呢&#xff0c;本文提供一个设计的思路。 以5x5为例&#xff0c;求出次小值&#xff0c; 第一步&#xff0c;先分…

H5 随机身份证号码、社会统一信用代码、手机号、名字、银行卡号码

平时注册可能会用到这些&#xff0c;原本用自己服务器搭了个&#xff0c;感觉纯前端的还能引入到项目中挺好的&#xff0c;之后再追加一些常用的随机数据&#xff0c;这样写表单应该就会好测试了(●’◡’●)。 在线链接 https://linyisonger.github.io/H5.Examples/?name./07…

华为OD机试 - 箱子之字形摆放(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【vue3】防抖与节流

1.防抖 &#xff08;多次触发 只执行最后一次&#xff09; 作用&#xff1a; 高频率触发的事件,在指定的单位时间内&#xff0c;只响应最后一次&#xff0c;如果在指定的时间内再次触发&#xff0c;则重新计算时间防抖类似于英雄联盟回城6秒&#xff0c;如果回城中被打断&…