云计算百科
云计算领域专业知识百科平台

Web开发进阶

文章目录

  • 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.staticpathpattern=/images/**
    spring.web.resources.staticlocations=classpath:/css

    过滤规则为/static/**,静态资源位置为classpath:/static/。

  • 注意:在前后端分离的项目中,static不会存放内容。

  • 项目结构:

    myproject/
    ├── 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
ContentType: multipart/formdata; boundary=WebKitFormBoundaryABC123

WebKitFormBoundaryABC123
ContentDisposition: formdata; name="username"

张三
WebKitFormBoundaryABC123
ContentDisposition: formdata; name="avatar"; filename="photo.jpg"
ContentType: image/jpeg

[这里是photo.jpg文件的二进制数据...]
WebKitFormBoundaryABC123
ContentDisposition: formdata; name="document"; filename="report.pdf"
ContentType: application/pdf

[这里是report.pdf文件的二进制数据...]
WebKitFormBoundaryABC123

2.2 SpringBoot实现文件上传功能

  • SpringBoot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。

  • 要更改这个默认值需要在配置文件(application.properties)中加入两个配置:

    spring.servlet.multipart.maxfilesize=10MB
    spring.servlet.multipart.maxrequestsize=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/**");
}
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » Web开发进阶
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!