文章目录
- 1 静态资源访问
- 2 文件上传
-
- 2.1 文件上传原理
- 2.2 SpringBoot实现文件上传功能
- 3 拦截器
-
- 3.1 拦截器定义
- 3.2 拦截器注册
1 静态资源访问
-
使用IDEA创建SpringBoot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下。当没有配置静态资源时,/后直接加静态资源的名称即可访问,例如:localhost:8080/test.jpg。
-
如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。
-
在application.properties中可以直接定义过滤规则和静态资源位置。通过static path设置虚拟路径(过滤规则),在资源前加一个统一的路径,方便管理;通过static locations进行修改路径,将静态资源放在自创文件中。其中,classpath是整个项目的类路径,在target/classes目录中,是指向项目内部资源文件的"快捷方式"。
spring.mvc.static–path–pattern=/images/**
spring.web.resources.static–locations=classpath:/css过滤规则为/static/**,静态资源位置为classpath:/static/。
-
注意:在前后端分离的项目中,static不会存放内容。
-
项目结构:
my–project/
├── src/
│ └── main/
│ ├── java/ // Java源代码
│ └── resources/ // 资源文件
│ ├── static/ // 静态资源
│ │ ├── css/
│ │ ├── js/
│ │ └── images/
│ └── application.properties
├── target/
│ └── classes/ // 编译后的文件(在classpath中)
│ ├── static/
│ │ ├── css/
│ │ ├── js/
│ │ └── images/
│ └── application.properties
└── pom.xml
2 文件上传
2.1 文件上传原理
表单的 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 当enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value;当enctype="multipart/form-data"时,其传输数据形式为:
POST /upload HTTP/1.1
Content–Type: multipart/form–data; boundary=——WebKitFormBoundaryABC123
———WebKitFormBoundaryABC123
Content–Disposition: form–data; name="username"
张三
———WebKitFormBoundaryABC123
Content–Disposition: form–data; name="avatar"; filename="photo.jpg"
Content–Type: image/jpeg
[这里是photo.jpg文件的二进制数据...]
———WebKitFormBoundaryABC123
Content–Disposition: form–data; name="document"; filename="report.pdf"
Content–Type: application/pdf
[这里是report.pdf文件的二进制数据...]
———WebKitFormBoundaryABC123—
2.2 SpringBoot实现文件上传功能
-
SpringBoot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
-
要更改这个默认值需要在配置文件(application.properties)中加入两个配置:
spring.servlet.multipart.max–file–size=10MB
spring.servlet.multipart.max–request–size=10MB -
当表单的enctype="multipart/form-data"时,可以使用 MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中。
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String upload(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/");
System.out.println(path);
saveFile(photo,path);
return "success upload";
}
public 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);
}
}
3 拦截器
拦截器在Web系统中非常常见,对于某些全局统一的操作(不同控制器可能遇见的统一操作),我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
- 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
- 性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。
- 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。
- 用户提交的请求都先到达拦截器,调用prehandle,最终到控制器的目标方法中,到页面渲染结束,再调用afterCompletion。
3.1 拦截器定义
- SpringBoot定义了HandlerInterceptor接口来实现自定义拦截器的功能。
- HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作。
- preHandle:在Controller方法之前执行。
- postHandle:在Controller方法之后,视图渲染之前执行。
- afterCompletion:在整个请求完成之后执行。
//整体架构
// 拦截器实现
LoginInterceptor (实现 HandlerInterceptor)
// 配置类
WebConfig (实现 WebMvcConfigurer)
public boolean preHandle(
HttpServletRequest request, // HTTP请求对象
HttpServletResponse response, // HTTP响应对象
Object handler // 处理请求的Controller方法
) throws Exception
- 创建Interceptor包,在下面创建LoginInterceptor类:
public class LoginInterceptor implements HandlerInterceptor {
//继承系统的拦截器类HandlerInterceptor
//重写prehandle方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor");
return true;
}
}
3.2 拦截器注册
- addPathPatterns方法定义拦截的地址。
- excludePathPatterns定义排除某些地址不被拦截。
- 添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求。
- 如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。
- 在config下创建WebConfig类:
@Configuration // 声明这是一个配置类
public class WebConfig implements WebMvcConfigurer {
//继承WebMvcConfiguer,一个专门做配置器的类
//重写addInterceptors方法
@Override
public void addInterceptors(InterceptorRegistry registry) {
//InterceptorRegistry 是 Spring MVC 中用于注册和配置拦截器的核心工具类
// 这里的 registry 参数就是 Spring 自动传入的 InterceptorRegistry 实例
// 配置1:拦截所有请求
registry.addInterceptor(new LoginInterceptor());
// 配置2:只拦截特定路径
// 只拦截/user开头的路径
// registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
}
}
网硕互联帮助中心





评论前必须登录!
注册