springboot拦截器以及文件上传

本文介绍了SpringBoot的视图解析流程,重点讲解了拦截器的工作原理,并提供了拦截器的实现步骤。同时,文章详细阐述了文件上传的前端和后端处理,包括表单设置、多文件上传及SpringBoot中大文件上传的配置问题和解决方案。

视图解析流程 (待debug)

iShot2021-07-25 19.09.35

拦截器原理

iShot2021-07-25 20.37.33

图示 :[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3V3mWqz9-1627222686253)(…/…/截图/iShot2021-07-25 20.38.00.png)]

  • 拦截实现流程:

    1. 创建一个自己的拦截器 实现handlerInterceptor接口 重写其中的三个方法
    public class MyInterceptor implements HandlerInterceptor {
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        log.info("拦截的路径为{}",uri);
    
        String loginMessage = "loginUser";
        if (request.getSession().getAttribute(loginMessage)!=null) {
          //            登陆成功
          return true;
        }else {
          //            登陆失败
          request.setAttribute("errorMessage","您尚未登陆,请登陆");
          request.getRequestDispatcher("/").forward(request,response);
          return false;
        }
        }
    
    1. 扩展配置WebMvcConfigurer

      编写自己的configation类 @Configation注解 标志这是一个javac配置类

      实现WebMvcConfigurer接口 重写addInterceptors方法

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
          .addPathPatterns("/**")  //拦截路径
          .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); //放行路径
      }
    }
    
    
  • tips

    对于资源放行和资源拦截

    首先我们定义的addPathPatterns拦截的/** 会将静态资源拦截 所以要配置excludePathPatterns的静态资源路径

文件上传

前台部分

  • form表单的参数设置 multipart: 多部件的
<!--文件上传form表单必须进行两个设置 
1. 提交方式为post 2. enctype = "multipart/form-date  -->
<form role="form" th:action="@{/uploadingFile}" method="post" enctype="multipart/form-data">
  • 多文件上传在input要设置multiple属性

后台部分

  • 使用注解接受参数 @RequestPart @RequesPparam

区别:

1.@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。
2.支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
3.@RequestParam也同样支持multipart/form-data请求。
4.他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。
5.@RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)。
public String uploadingFile(@RequestParam("username") String username,
                            @RequestParam("password") String password,
                            @RequestPart("onePhoto") MultipartFile onePhoto,
                            @RequestPart("photos") MultipartFile[] photos,
                            Model model){...}
  • 根据springboot自动配置的数据 若不进行更改直接上传较大文件会报错 如下iShot2021-07-25 21.38.26

  • 解决方法如下:

    需要进行对multiPartAutoConfigation的操作 也就是重新配置注入属性

    1. 首先找到MultipartAutoConfiguration类 发现**@EnableConfigurationProperties注解中自动配置导入的类为MultipartProperties** 进入此类 可发现配置如下image-20210725220408996

      iShot2021-07-25 21.40.09

    2. 在yaml中进行配置后 可以正常上传 image-20210725220503536

  • 后台代码

 @PostMapping("/uploadingFile")
 public String uploadingFile(@RequestParam("username") String username,
                              @RequestParam("password") String password,
                              @RequestPart("onePhoto") MultipartFile onePhoto,
                              @RequestPart("photos") MultipartFile[] photos,
                              Model model) throws IOException {
  // 获取愿文件名
  String originalFilename = onePhoto.getOriginalFilename();
  // 上传单个文件
  onePhoto.transferTo(new File("/Users/rain/Desktop/"+originalFilename));
  // 上传多个文件
  if (photos!=null) {
    for (MultipartFile photo : photos) {
      String filename = photo.getOriginalFilename();
      photo.transferTo(new File("/Users/rain/Desktop/"+filename));
    }
  }
  return "main";
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值