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,一经查实,立即删除!

相关文章

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

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

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 连接数据库…

【项目管理】进度管理

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

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;然后再通过这个首字母找到我们所想要的汉字。这个过程其实就代表了…

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

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

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

文章目录 一、服务治理网路数据支撑日志处理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 拓扑排…

4核8g服务器能支持多少人访问?价格感人,不知道性能如何

腾讯云轻量4核8G12M服务器配置446元一年&#xff0c;646元12个月&#xff0c;腾讯云轻量应用服务器具有100%CPU性能&#xff0c;系统盘为180GB SSD盘&#xff0c;12M带宽下载速度1536KB/秒&#xff0c;月流量2000GB&#xff0c;折合每天66.6GB流量&#xff0c;超出月流量包的流…

Linux下Arthas(阿尔萨斯)的简单使用-接口调用慢排查

使用环境 k8s容器内运行了一个springboot服务&#xff0c;服务的启动方法是main()方法 下载并启动 arthas curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar选择应用 java 进程 就一个进程org.apache.catalina.startup.Bootstrap&#xff0c;输…

支小蜜AI校园防欺凌系统可以使用在宿舍吗?

随着人工智能技术的快速发展&#xff0c;AI校园防欺凌系统已成为维护校园安全的重要手段。然而&#xff0c;关于这一系统是否适用于宿舍环境&#xff0c;仍存在一些争议和讨论。本文将探讨AI校园防欺凌系统在宿舍中的适用性&#xff0c;分析其潜在的优势与挑战&#xff0c;并提…

Vue.js 应用实现监控可观测性最佳实践

前言 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 TinyPro 是一套使用 Vue …

提升用户体验,Xinstall智能判定拉起技术来袭

在移动互联网时代&#xff0c;App推广已经成为各大企业的必争之地。然而&#xff0c;随着市场竞争的加剧&#xff0c;如何提升App的转化效率和用户体验成为了推广者们亟待解决的问题。这时&#xff0c;Xinstall的智能判定拉起技术应运而生&#xff0c;为推广者们带来了新的解决…

安卓百度地图API显示隐藏Marker

方法 BaiduMap.Marker.setVisible(boolean) 实现 List<Marker> list_marker new ArrayList<>(); boolean isShowMarker true;Override public boolean onCreateOptionsMenu(Menu menu) {String[] sm { "显隐信息", "显隐照片", "截…

OJ_最大序列和

题干 C实现 #include <stdio.h> #include <algorithm> using namespace std;long long s[1000001]; long long dp[1000002];//dp[i]是前i个元素中必须包含右边缘的最大子序和int main() {int n;scanf("%d",&n);for(int i 0; i< n;i){scanf(&quo…

【Vue3】Vue3中路由规则的 props 配置

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…