当前位置: 首页 > news >正文

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

相关文章:

  • SpringBoot(RESTful,统一响应结构,输出日志,增删改查功能,分页功能,批量删除,常见bug)【详解】
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • Elasticsearch:调整近似 kNN 搜索
  • 微信小程序调用百度智能云API(菜品识别)
  • 【计算机网络】集线器
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)
  • 前端开发者如何打造自己的生态以及ip
  • 哥斯拉流量webshell分析-->ASP/PHP
  • Docker 笔记(五)--链接
  • Qt 信号槽
  • 【学习学习】学习金字塔
  • IIS上部署.netcore WebApi项目及swagger
  • 行为型-观察者模式
  • php常用设计模式应用场景及示例
  • 超实用!免费软件站大盘点,总有一款适合你
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • centos安装java运行环境jdk+tomcat
  • Java超时控制的实现
  • linux学习笔记
  • Netty源码解析1-Buffer
  • PAT A1092
  • Python 基础起步 (十) 什么叫函数?
  • React Transition Group -- Transition 组件
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • XForms - 更强大的Form
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 数组大概知多少
  • 在Mac OS X上安装 Ruby运行环境
  • 主流的CSS水平和垂直居中技术大全
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • # 计算机视觉入门
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #在 README.md 中生成项目目录结构
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二)WCF的Binding模型
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)appium-desktop定位元素原理
  • (转)setTimeout 和 setInterval 的区别
  • (转载)从 Java 代码到 Java 堆
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net 4.0并行库实用性演练
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net/c# memcached 获取所有缓存键(keys)