SpringBoot(拦截器+文件上传)

文章目录

    • 1.拦截器
        • 1.基本介绍
        • 2.应用实例
          • 1.去掉Thymeleaf案例中使用session进行权限验证的部分
          • 2.编写自定义拦截器 LoginInterceptor.java 实现HandlerInterceptor接口的三个方法
          • 3.注册拦截器
            • 1.第一种方式 配置类直接实现WebMvcConfigurer接口,重写addInterceptors方法
            • 2.第二种方式 注入一个WebMvcConfigurer接口类型的bean,使用匿名内部类实现接口的方法
            • 3.注册拦截器方式小结
        • 3.注意事项和细节
          • 1.关于图片资源
          • 2.uri和url的区别
    • 2.文件上传
        • 1.需求分析
        • 2.具体实现
          • 1.编写upload.html
          • 2.编写UploadController.java 可以请求转发到upload.html
          • 3.编写Controller来将上传的文件保存到D:\temp_upload
          • 4.升级版,将上传的文件保存到动态创建的目录(常用)
          • 5.测试
        • 3.注意事项和细节
          • 1.文件上传的限制
            • 1.MultipartProperties
            • 2.修改文件上传的限制大小 application.yml
          • 2.同名文件覆盖问题
          • 3.分目录存放
            • 1.WebUtils.java
            • 2.修改代码

1.拦截器

1.基本介绍

image-20240315132915030

2.应用实例
1.去掉Thymeleaf案例中使用session进行权限验证的部分
2.编写自定义拦截器 LoginInterceptor.java 实现HandlerInterceptor接口的三个方法
package com.sun.springboot.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** @author 孙显圣* @version 1.0*/
public class LoginInterceptor implements HandlerInterceptor {@Override//在Controller之前调用public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("uri=" + request.getRequestURI());//对登录的校验HttpSession session = request.getSession();//如果session中有LoginAdmin则登录成功if (session.getAttribute("LoginAdmin") != null) {return true;} else {//如果登录失败则将信息请求转发到首页面request.setAttribute("msg", "登录失败,请重新登录");request.getRequestDispatcher("/").forward(request, response);return false;}}@Override//在Controller之后调用public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle被调用");}@Override//视图解析器将信息请求转发到某个页面,然后将那个页面相应给浏览器时调用public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion被调用");}
}
3.注册拦截器
1.第一种方式 配置类直接实现WebMvcConfigurer接口,重写addInterceptors方法
package com.sun.springboot.config;import com.sun.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author 孙显圣* @version 1.0*/@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册拦截器并且设置拦截路径和排除路径,这里的/是根路径registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/", "/login", "/images");}
}
2.第二种方式 注入一个WebMvcConfigurer接口类型的bean,使用匿名内部类实现接口的方法
package com.sun.springboot.config;import com.sun.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author 孙显圣* @version 1.0*/
@Configuration
public class WebConfig02 {//注册拦截器@Bean //注入一个WebMvcConfigurer接口类型的bean,使用匿名内部类实现接口的方法public WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/", "/login", "/images");}};}
}
3.注册拦截器方式小结
  • 第一种方式是配置类实现WebMvcConfigurer接口,利用配置类的特性来注入bean
  • 第二种方式是在配置类中注入一个bean,是WebMvcConfigurer接口类型的
  • 他们的共通点就是:都向容器中注入了一个实现了WebMvcConfigurer接口的bean
3.注意事项和细节
1.关于图片资源
  • 如果不放行,则在第一次进入登录界面时,还会向服务器申请图片资源,此时会被拦截
  • 图片资源路径的设置是按照设置的访问路径,默认是http://localhost:8080/下的资源
2.uri和url的区别
  • uri就是服务器内部的路径/代表的是服务器根路径
  • url是浏览器地址栏的路径

image-20240315160850884

2.文件上传

1.需求分析

image-20240315163842285

2.具体实现
1.编写upload.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>upload</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>注册用户~</h1><form action="#" method="post" th:action="@{/upload}" enctype="multipart/form-data">用户名:<input type="text" style="width:150px" name="name"/><br/><br/>电 邮:<input type="text" style="width:150px" name="email"/><br/><br/>年 龄:<input type="text" style="width:150px" name="age"/><br/><br/>职 位:<input type="text" style="width:150px" name="job"/><br/><br/>头 像:<input type="file" style="width:150px" name="header"><br/><br/><!--这里使用的multiple表示可以一次上传多个文件-->宠 物:<input type="file" style="width:150px" name="photos" multiple><br/><br/><input type="submit" value="注册"/><input type="reset" value="重新填写"/></form>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>
2.编写UploadController.java 可以请求转发到upload.html
package com.sun.springboot.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;/*** @author 孙显圣* @version 1.0*/
@Controller
@Slf4j
public class UploadController {@GetMapping("/upload.html")public String uploadPage() {//请求转发到upload.htmlreturn "upload";}
}
3.编写Controller来将上传的文件保存到D:\temp_upload
   //处理有文件的表单@ResponseBody@PostMapping("/upload")//获取上传的表单信息public String upload(@RequestParam("name") String name,@RequestParam("email") String email,@RequestParam("age") Integer age,@RequestParam("job") String job,@RequestParam("header") MultipartFile header,@RequestParam("photos") MultipartFile[] photos) throws IOException {//显示获取到的信息log.info("name={} email={} age={} job={} header={} photos={}",name, email, age, job, header, photos);//首先处理单个文件if (!header.isEmpty()) {//文件不为空则获取文件的名字String originalFilename = header.getOriginalFilename();//将文件转存在磁盘的指定位置D:\temp_uploadheader.transferTo(new File("D:\\temp_upload\\" + originalFilename));}//处理文件数组if (photos.length > 0) {//只要长度大于0,就遍历for (MultipartFile photo : photos) {//获取当前文件的名字String originalFilename = photo.getOriginalFilename();if (!photo.isEmpty()) {//只要文件不为空就转存photo.transferTo(new File("D:\\temp_upload\\" + originalFilename));}}}return "文件上传成功!";}
4.升级版,将上传的文件保存到动态创建的目录(常用)
    //处理有文件的表单@ResponseBody@PostMapping("/upload")//获取上传的表单信息public String upload(@RequestParam("name") String name,@RequestParam("email") String email,@RequestParam("age") Integer age,@RequestParam("job") String job,@RequestParam("header") MultipartFile header,@RequestParam("photos") MultipartFile[] photos) throws IOException {//处理单个文件,存到动态创建的文件夹下if (!header.isEmpty()) {//1.文件不为空则获取文件的名字String originalFilename = header.getOriginalFilename();//2.动态创建一个类路径下的自定义目录//2.1 获取类路径的绝对路径// /D:/Intelij_IDEA_Project/springboot/springboot-usersys/target/classes/String classPath = ResourceUtils.getURL("classpath:").getPath();//2.2 拼接目录,得到想要创建的目录的文件对象File targetFile = new File(classPath + "static\\upload\\");//2.3 只要目录不存在就动态创建目录if (!targetFile.exists()) {targetFile.mkdirs(); //注意这里是多级目录必须加s}//3.将文件转存到这个自定义目录下//3.1 获取这个目录的绝对路径String targetAbsolutePath = targetFile.getAbsolutePath();//3.2 将文件转存到这个路径下// D:\Intelij_IDEA_Project\springboot\springboot-usersys\target\classes\static\(注意upload没有\)uploadheader.transferTo(new File(targetAbsolutePath + "\\" + originalFilename));}//处理文件数组,存到磁盘指定位置if (photos.length > 0) {//只要长度大于0,就遍历for (MultipartFile photo : photos) {//获取当前文件的名字String originalFilename = photo.getOriginalFilename();if (!photo.isEmpty()) {//只要文件不为空就转存photo.transferTo(new File("D:\\temp_upload\\" + originalFilename));}}}return "文件上传成功!";}
5.测试

image-20240315175132772

3.注意事项和细节
1.文件上传的限制
1.MultipartProperties

image-20240315175524538

2.修改文件上传的限制大小 application.yml
spring:servlet:multipart:max-file-size: 10MB #单个文件大小上限max-request-size: 50MB #一次请求的文件大小上限
2.同名文件覆盖问题

image-20240315191141767

3.分目录存放
1.WebUtils.java
package com.sun.springboot.utils;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Stack;/*** @author 孙显圣* @version 1.0*/
public class WebUtils {//上传文件的前缀public static String UPLOAD_FILE_DIRECTORY = "static\\upload\\";//编写方法,根据当前日期生成一个目录public static String getUploadFileDirectory() {return UPLOAD_FILE_DIRECTORY +new SimpleDateFormat("yyyy\\MM\\dd").format(new Date()) + "\\";}}
2.修改代码

image-20240315192653677

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

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

相关文章

C++语言学习(一)—— 认识C++语言

目录 一、C语言 二、C与C语言的区别 2.1 预处理器 2.2 标准库 2.3 类型 2.4 函数重载 2.5 内存管理 2.6 输入输出函数 2.7 关键字 三、C的基本结构 一、C语言 C语言是一种高级编程语言&#xff0c;由Bjarne Stroustrup在20世纪80年代初设计和开发。它是C语言的扩展&a…

综合小区管理系统|基于Springboot的综合小区管理系统设计与实现(源码+数据库+文档)

综合小区管理系统目录 目录 基于Springboot的综合小区管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、出入管理 2、报修管理 3、车位管理 4、公告管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

git 将某些代码一个分支转移到另一个分支

https://blog.csdn.net/huyongfu2004/article/details/122239102 假设A分支已经有修改的代码 提交过了 但是没有合并到master&#xff1b; 想要吧A分支这次的修改单独提交 已经commit 查看提交的commit号 git log切到新的分支&#xff0c;后将该commit id pick到正确分支 g…

day06、07-MySQL

文章目录 一、MySQL概述1.1 安装1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 二. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库…

【English Learning】Day13

2024/03/14 和小录打卡的第13天 目录 Words & phrases Words & phrases incrredibly incredibly busy 超级忙merely not merely 不仅仅tragedy a terible tregedy 可怕的悲剧a personal tragedy 个人遭遇strive strive to be best 努力做最好的strive for peace 为和平…

【项目管理】进度管理

一、前言 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一个过程&#xff0c;可以由一个人在较短时间内完成。项目管理团队编制进度计划的一般步骤为&#xff1a;首先选择进度计划方法…

Qt+FFmpeg+opengl从零制作视频播放器-7.OpenGL播放视频

在上一节Qt+FFmpeg+opengl从零制作视频播放器-6.视频解码中,我们学到了如何将视频数据解码成YUV原始数据,并且保存到本地,最后使用工具来播放YUV文件。 本节使用QOpenGLWidget来渲染解码后的YUV视频数据。 首先简单介绍QOpenGLWidget的使用。 QOpenGLWidget类是用于渲染O…

HTML—标签的分类,span和div标签,不同的标签之间类型转换

标签的分类&#xff1a; ①块级标签&#xff1a;无论内容多少&#xff0c;会充满整个行。大小可自定义 例&#xff1a;p&#xff0c;h1&#xff0c;ul&#xff0c;ol&#xff0c;hr 等 ②行级标签&#xff1a;自身的大小就是标签的大小&#xff0c;不会占一整行。大小不可调 例…

密码保护小贴士:如何应对常见的网络钓鱼攻击?

网络钓鱼攻击是一种常见的网络欺诈手段&#xff0c;针对个人隐私和财产安全构成威胁。以下是一些密码保护的小贴士&#xff0c;帮助您应对常见的网络钓鱼攻击&#xff1a; 1.谨慎点击链接&#xff1a;收到来历不明的邮件、短信或社交媒体消息时&#xff0c;不要轻易点击其中的…

Python 基础语法:基本数据类型(字典)

为什么这个基本的数据类型被称作字典呢&#xff1f;这个是因为字典这种基本数据类型的一些行为和我们日常的查字典过程非常相似。 通过汉语字典查找汉字&#xff0c;首先需要确定这个汉字的首字母&#xff0c;然后再通过这个首字母找到我们所想要的汉字。这个过程其实就代表了…

easyexcel导出excel文件到s3服务器

导出excel文件是开发中常见的需求 常见的做法一般是直接通过请求接口响应对象HttpServletResponse把文件输出 我们可以使用原生的poi工具类操作.也可以使用easypoi.easyexcel等基于poi二次封装的工具处理 下面是代码 /*** 导出列表** param request* param response*/Overri…

腾讯,百度后端实习一面面经base上海

腾讯面经 拷打后端项目 mysql查询去重怎么建表的项目中一些接口的实现设计场景&#xff1a;抖音有个搜索功能&#xff0c;要搜索并展示用户和视频的信息&#xff0c;你要怎么实现用户的鉴权是怎么设计的设置mysql连接池的参数的依据gorm怎么防止sql注入get和post的区别&#…

SPA富应用开发

1、开发环境的安装&#xff1a; 笔者在安装过程中&#xff0c;出现了版本问题&#xff0c;所以&#xff0c;在这里做出提醒&#xff0c;要是安装不成功&#xff0c;爆出版本问题&#xff0c;执行下面的命令&#xff0c;命令的来源是这里&#xff1a;Install Docker Engine on …

YoloV8改进策略:下采样改进|HWD改进下采样

摘要 本文使用HWD改进下采样&#xff0c;在YoloV8的测试中实现涨点。 论文解读 在卷积神经网络&#xff08;CNNs&#xff09;中&#xff0c;极大池化或跨行卷积等下采样操作被广泛用于聚合局部特征、扩大感受野和最小化计算开销。然而&#xff0c;对于语义分割任务&#xff…

2024年,如何长久做好一家抖音小店?明白这几点就可以了!

大家好&#xff0c;我是电商糖果 有人曾经问过糖果&#xff0c;自己做抖音小店想要长期去玩&#xff0c;可能要做个三四年&#xff0c;甚至更久。 糖果做电商7年了&#xff0c;从2020年开始做抖音小店&#xff0c;现在已经四年了。 所以你如果问我是怎么可以将这个项目做那么…

谷粒商城——分布式基础(全栈开发篇第一部分)

文章目录 一、服务治理网路数据支撑日志处理ELK应用监控集成工具开发工具 二、环境创建1、虚拟机创建2、虚拟机安装docker等1. 安装docker1. 配置阿里docker3.docker安装mysql错误 4、docker安装redis 3、软件1.Maven 阿里云镜像1.8jdk2、idea lombokmybatisX &#xff0c;3、 …

熔断降级的方案实现

熔断降级的方案实现 Spring Cloud Netflix Hystrix 提供线程隔离、服务降级、请求缓存、请求合并等功能可与Spring Cloud其他组件无缝集成官方已宣布停止维护&#xff0c;推荐使用Resilience4j代替 Spring Cloud Resilience4j 轻量级服务熔断库 提供类似于Hystrix的功能 具有更…

C++手写链表、反转链表、删除链表节点、遍历、为链表增加迭代器

本篇博客介绍如何使用C实现链表&#xff0c;首先编写一个简单的链表&#xff0c;然后增加模板&#xff0c;再增加迭代器。 简单链表的实现 链表的结构如下&#xff1a; 首先需要定义链表的节点&#xff1a; struct ListNode {int data;ListNode* pNext;ListNode(int value …

【C++算法模板】图论-拓扑排序,超详细注释带例题

文章目录 0&#xff09;概述1&#xff09;Kahn算法1&#xff1a;数据结构2&#xff1a;建图3&#xff1a;Kanh算法 2&#xff09;DFS染色1&#xff1a;数据结构2&#xff1a;建图3&#xff1a;DFS 3&#xff09;算法对比【例题】洛谷 B3644 推荐视频链接&#xff1a;D01 拓扑排…

JS(一)变量与常量,作用域

JS&#xff08;一&#xff09;变量与常量,作用域 一变量与常量 在JavaScript中&#xff0c;关于变量声明有三种方式&#xff1a;var、let和const&#xff0c;它们之间有一些区别。 01 var 存在变量提升的问题&#xff0c;即变量可以在声明之前被访问。没有块级作用域&#…