springboot2----拦截器和文件上传功能(代码片段)

大忽悠爱忽悠 大忽悠爱忽悠     2022-12-16     750

关键词:


表单重复提交问题

问题描述:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。

产生原因:

  • 这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面。
  • 这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面。

解决方案:

  • 使用重定向跳转到目标页面

详细参考这篇文章


不经过登录直接来到某一页面的问题----拦截器

解决方案:

  • 拦截器进行登录检查,防止不经过登录直接来到某一页面

我们这里的拦截器拦截的路径是/** :任意多层路径下的所有请求都会被拦截,那么静态资源就会被拦截


如何解决静态资源被拦截器拦截的问题

  • 1.放行对应的所有静态资源文件夹
  registry.addInterceptor(new LoginHanlderIntercept()).
            //拦截任意多层路径下的所有请求,某些请求不进行拦截
            addPathPatterns("/**").excludePathPatterns("/","/login")
            //将静态资源文件夹的资源放行
    .excludePathPatterns("/css/**","/fonts/**","/images/**","/js/**");
  • 2.可以给静态资源文件访问路径加上一个前缀,放行对应前缀下的所有静态资源请求(这样会导致首页和图标功能失效)

具体实施步骤:

  1. 自定义登录拦截器,通过获取session中存放的数据,来判断是否已经登录过
public class LoginHanlderIntercept implements HandlerInterceptor

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
        Object user=request.getSession().getAttribute("loginUser");
        if(user==null)
        
            //未登陆,返回登陆页面
            request.setAttribute("msg","没有权限请先登陆");
            //转发到登录页
            request.getRequestDispatcher("/").forward(request,response);
            //重定向到登录页,但是这样是两次请求,那么登录页面就无法获取到request域中的值
            //response.sendRedirect("/");
            return false;
        
        else
        
            //已登陆,放行请求
            return true;
        
    

   @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 

    

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 
    


  • 2.如果登录成功,那么往session中存放一个username作为登录凭证
@Controller
public class IndexController

    //get方式的请求,来到登录页面
    @GetMapping("/","/login")
    public String ToLoginPage()
    
        //到达登录页面
        return "login";
    

    //post方式的请求来到主页面
    @PostMapping("/login")
    public String main(User user, HttpSession session, Model model)
    
        //如果用户名和密码不为空,就放到session域中保存起来
        if(!StringUtils.isEmpty(user.getUsername())&&!StringUtils.isEmpty(user.getPassword()))
        
            //登录成功后,将登录用户的信息放入到session域中
            session.setAttribute("loginUser",user);
            //防止表单重复提交建议使用重定向
            //登录成功重定向到main.html
            return "redirect:main.html";
        
        else
        
            model.addAttribute("msg","账号密码错误");
            //回到主页
            return "login";
        
    

    //去main页面
    @GetMapping("/main.html")
    public String mainPage()
    
        return "main";
    


  • 3.在springmvc扩展类中将自定义的拦截器进行注册
@Configuration
public class WebConfig implements WebMvcConfigurer


    @Override
    public void addInterceptors(InterceptorRegistry registry)
    
    registry.addInterceptor(new LoginHanlderIntercept()).
            //拦截任意多层路径下的所有请求,某些请求不进行拦截
            addPathPatterns("/**").excludePathPatterns("/","/login")
            //将静态资源文件夹的资源放行
    .excludePathPatterns("/css/**","/fonts/**","/images/**","/js/**");
    



拦截器步骤总结

  • 编写一个拦截器实现HandlerInterceptor接口
  • 拦截器注册到容器中(实现WebMvcConfigurer的addInterceptor方法)
  • 指定拦截规则,如果是拦截所有,静态资源也会被拦截

拦截器原理

  1. 根据当前请求,找到HandlerExecutionChain【可以处理请求的handler以及handler的所有 拦截器】
  2. 先来顺序执行 所有拦截器的 preHandle方法
    2.1如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
    2.2 如果当前拦截器返回为false。直接倒序执行所有已经执行了的拦截器的 afterCompletion;
  3. 如果任何一个拦截器返回false。直接跳出不执行目标方法
  4. 所有拦截器都返回True。执行目标方法
  5. 倒序执行所有拦截器的postHandle方法。
  6. 前面的步骤有任何异常都会直接倒序触发已经执行了的拦截器的 afterCompletion
  7. 页面成功渲染完成以后,也会倒序触发 afterCompletion


thymeleaf可以通过抽取部分重复模板片段,减少重复工作量

Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove

任何一个页面,如果想要被thymeleaf模板引擎解析,都必须在对应页面引入模板引擎的th名称空间


文件上传功能

   //MultipartFile---自动封装上传过来的文件
    @PostMapping("/upload")
    public String upload(@RequestParam("name")String name,
                          //单个文件上传
                          @RequestPart("hs") MultipartFile headImage,
                         //多文件上传--数组形式
                         @RequestPart("ls")MultipartFile[] photos) throws IOException 
        //日志调试,是占位符,有几个,后面对应跟着的参数就需要有几个
        log.info("上传的信息: username=,headImage=,photos=",
                name,headImage.getSize(),photos.length);
        //下面展示将上传的文件,保存到电脑的对应磁盘路径
        //上传的文件不为空,才保存到磁盘中
        if(!headImage.isEmpty())
            //下面是获取上传文件的原始文件名
            String originalFilename = headImage.getOriginalFilename();
            headImage.transferTo(new File("D:\\\\resource\\\\"+originalFilename));
        
         //多文件上传,如果文件数组不为空,才进行保存操作
        if(photos.length > 0)
            for (MultipartFile photo : photos) 
                if(!photo.isEmpty())
                    String originalFilename = photo.getOriginalFilename();
                    photo.transferTo(new File("D:\\\\resource\\\\"+originalFilename));
                
            
        
        return "main";
    

表单部分的文件上传固定格式写法

                        <form role="form" th:action="@/upload" method="post" enctype="multipart/form-data">
                          ...
                            <div class="form-group">
                                <label for="exampleInputFile">头像</label>
                                <input type="file" name="hs" id="exampleInputFile">
                            </div>
                            <div class="form-group">
                                <label for="exampleInputFile">生活照片</label>
                                <!--这里multiple表示是多文件上传,可以选择多个文件同时上传-->
                                <input type="file" name="ls" id="photos" multiple>
                            </div>
                            ...
                        </form>

springboot自动配置的文件上传功能中对单个文件上传大小和一次请求可以上传的总文件大小做了限制,我们可以在配置文件中进行修改

MultipartAutoConfiguration是对应的文件自动配置类,MultipartProperties是对应和配置文件绑定的类,默认文件上传相关初始化的值,就是从这里面获取的

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB

文件上传结果演示:


javaee框架技术之6-springmvc拦截器和文件上传功能(代码片段)

文件上传下载文件上传文件上传是项目开发中最常见的功能之一,springMVC可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传... 查看详情

javaee框架技术之6-springmvc拦截器和文件上传功能(代码片段)

文件上传下载文件上传文件上传是项目开发中最常见的功能之一,springMVC可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传... 查看详情

javaee框架技术之6-springmvc拦截器和文件上传功能(代码片段)

文件上传下载文件上传文件上传是项目开发中最常见的功能之一,springMVC可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传... 查看详情

springboot2.x实现文件上传与下载(代码片段)

...IO流的方式进行上传和下载文件,本文讲解几种基于SpringBoot2.x来实现文件上传与下载的操作。文件上传配置文件上传大小限制spring.servlet.multipart.max-file-size 查看详情

springmvc文件上传下载和拦截器(代码片段)

文件上传SpringMVC上下文中默认没有装配MultipartResesolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在springMvc配置文件中配置MultipartResolver<beanid="multipartResolver"class="org.sp... 查看详情

struts2学习————文件上传和下载

...应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮我们全做完了。我们只需要添加一点点信息,就可以完成上传的功能。        1、Action中需要提供三个属性          FilefieldName;  //文件... 查看详情

springmvc08:拦截器+文件上传下载

1、拦截器1.1、概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。过滤器与拦截器的区别:拦截器是AOP思想的具体应用。过滤器ser... 查看详情

nestjs文件上传

参考技术A文件上传需要使用拦截器UseInterceptors在\'@nestjs/common\'包内拦截器功能参考:https://docs.nestjs.cn/7/interceptors单文件上传所需依赖有FileInterceptor,UploadedFileFileInterceptor是拦截器负责处理请求接口后的文件再使用UploadedFile进行接... 查看详情

springmvc文件上传和拦截器(代码片段)

文章目录文件上传拦截器文件上传1.首先我们要导入文件上传下载所需的jar文件<!--上传/下载文件时必须依赖apache提供的jar包--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><ve... 查看详情

springboot2.0+自定义拦截器静态资源问题

...的.静态文件不需要进行放行,springboot会自动帮你放行。springboot2.0之后如果想要自定义的话就不可以了,需要手动放行静态资源。此处我是实现了WebMvcConfigurer来自定义拦截器(根据需求也可以继承WebMvcConfigurationSuppor 查看详情

springboot2.x文件上传实战

设置上传的文件大小:@ConfigurationpublicclassfileConfigure{@BeanpublicMultipartConfigElementmultipartConfigElement(){MultipartConfigFactoryfactory=newMultipartConfigFactory();//单个文件的大小factory.setMaxFileSize("20 查看详情

springmvc(代码片段)

...SpringMVC中的异常处理异常处理的思路实现步骤SpringMVC中的拦截器拦截器的作用自定义拦截器的步骤拦截器的细节正常流程测试中断流程测试拦截器的简单案例(验证用户是否登录& 查看详情

Spring Boot 2.0.0.M6 和文件上传超过 10 MB

】SpringBoot2.0.0.M6和文件上传超过10MB【英文标题】:SpringBoot2.0.0.M6andfileuploadmorethan10MB【发布时间】:2018-06-0606:56:30【问题描述】:在我的SpringBoot2.0.0.M6application.properties中,我添加了以下几行:spring.http.multipart.max-file-size=100MBspring.... 查看详情

springboot2.x:文件上传(代码片段)

文件上传有两个要点一是如何高效地上传:使用MultipartFile替代FileOutputSteam二是上传文件的路径问题的解决:使用路径映射文件路径通常不在classpath,而是本地的一个固定路径或者是一个文件服务器路径 SpringBoot的路径:src/mai... 查看详情

关于springmvc拦截器和异常(代码片段)

一.文件上传1.文件上传SpringMVC为文件上传提供了直接的支持,这种类型是通过即插即用的MultipartResolver技术的。Spring用JakartaCommonsFileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver.SpringMVC上下文中默认没有装配Multipart... 查看详情

springboot2.x上传文件限制大小

SpringBoot1.3.x multipart.maxFileSizemultipart.maxRequestSizeSpringBoot1.4.xand1.5.xspring.http.multipart.maxFileSizespring.http.multipart.maxRequestSizeSpringBoot2.xspring.servlet.multipart.maxF 查看详情

[springboot2]拦截器

拦截器1.编写一个拦截器实现HandlerInterceptor接口2.拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)3.指定拦截规则[如果是拦截所有,静态资源也会被拦截]1、HandlerInterceptor接口/***登录检查*1、配置好拦截器要拦截哪些请求*... 查看详情

springboot2.x文件上传出现thefieldfileexceedsitsmaximumpermittedsizeof1048576bytes

现象:在SpringBoot项目中进行文件上传时,由于之前都是使用的小文件来测试,并没有出现问题,也就没有考虑到文件上传大小限制的问题,今天在处理视频上传时,提示下面的错误:org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitEx... 查看详情