web开发进阶
1.静态资源访问
2.文件上传
3.拦截器
1.静态资源访问
a.使用IDEA创建SpringBoot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下。
b.如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。
C.在application.properties中直接定义过滤规则和静态资源位置:
首先在? src/main/resources/static/下放了一张test.jpg图片
Springboot默认是放到根目录下直接访问,所以直接访问localhost:8080/test.jpg即可
如果想将其路径放在static下,即通过在application.properties中添加:
spring.mvc.static-path-pattern=/static/**
那么重新启动springboot后,再次访问localhost:8080/test.jpg
访问 localhost:8080/static/test.jpg
另外一个则是静态资源的位置:
spring.web.resources.static-localtions=classpath:/static/
即静态资源位置位于:classpath:/static/
2.文件上传:
Springboot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1MB,单词请求的文件的总数不能大于10MB,所以需要在配置文件application.properties中加入两个配置。
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
package com.example.demo.demos.web;
import java.io.File;
import java.io.IOException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
public class FileController {
private static final String UPLOAD_FOLDER = System.getProperty("user.dir")+"/uplpad/";
@PostMapping("/updemo")
public String upload(String nickname,MultipartFile f) throws IOException{
System.out.print("文件大小"+ f.getSize());
System.out.print("文件类型"+ f.getContentType());
System.out.print("文件原始名称"+ f.getOriginalFilename());
System.out.print("文件路径"+ System.getProperty("user.dir"));
saveFile(f);
return "上传成功";
}
public void saveFile(MultipartFile f)throws IOException{
File upDir = new File(UPLOAD_FOLDER);
if (!upDir.exists()) {
upDir.mkdir();
}
File file = new File(UPLOAD_FOLDER + f.getOriginalFilename());
f.transferTo(file);
}
}
测试:将test.jpg这张图片上传,如果上传成功,该图片则会出现在upload目录下。
3.拦截器
拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现,总结起来,拦截器大致有以下几种使用场景:
a.权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
b.性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录时间,在处理后记录时间,从而得到该请求的处理时间
c.通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。
在SpringBoot中,SpringBoot则是定义了HandlerInterceptor接口来实现自定义拦截器的功能,HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法。
简单设置一个拦截器(拦截器返回值是布尔值):
package com.example.demo.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class loginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("loginInterceptor");
return false;
}
}
写完拦截器后,需要通过Config注解,将拦截器加入到Springboot当中,需要写一个配置类:
?
package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.example.demo.interceptor.*;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new loginInterceptor()).addPathPatterns("/user/**");
}
}
全部搞定之后,再次请求:localhost:8080/user,你会看到一下结果: