spring表单重复提交、文件上传与下载

247 阅读1分钟

一、表单重复提交

  • 该方法判读是否重复提交的原理就是判断发送表单提交时是否有token,token是存在session中的会话,第一次提交,save为true,进入拦截器,第一次存在session,成功提交表单,移除session,第二次同样的请求,session已经被移除,进入remove()方法,并提示不要重复提交表单

1、接口文件:

package com.zking.Interceptor;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
​
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {
    boolean save() default false;
    boolean remove() default false;
}
​

2、拦截器文件:

package com.zking.Interceptor;
​
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        handlerMethod 包含了控制器方法信息
        if (handler instanceof HandlerMethod) {
            HandlerMethod hm = (HandlerMethod) handler;
//             拿到控制器方法,上的token注解
            Token token =hm.getMethodAnnotation(Token.class);
            if(token!=null) {
//             表示要跳转到表单页面
                if(token.save()){
                      request.getSession().setAttribute("token","");
                }
//                表示正在提交修改或添加表单
                if(token.remove()) {
                    if(isRepeat(request)) {// 重复提交或者非法提交
                        request.getRequestDispatcher("/WEB-INF/repeat.jsp").forward(request,response);
                        return false;
                    }
                    request.getSession().removeAttribute("token");
                }
            }
        }
        return true;
    }
    public boolean isRepeat(HttpServletRequest request) {
        Object token = request.getSession().getAttribute("token");
        return  token==null;
    }
}
​
​

3、配置文件中:

        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.zking.Interceptor.TokenInterceptor"></bean>
        </mvc:interceptor>

4、测试类:

页面1:

<a href="/emps/toadd">添加</a>

页面2:

    <form action="/emps/add" method="post">
        姓名: <input name="name">
        <button>提交</button>
    </form>

5、控制器文件:

​
    @RequestMapping("toadd")
    @Token(save = true)
    public String toadd() {
        return "empadd";
    }
​
    @RequestMapping("add")
    @Token(remove = true)
    public String add(String name) {
        System.out.println("添加员工" + name);
        return "index";
    }

6、测试

  • 第一次提交

提交结果.png

  • 第二次提交

重复提交.png

二、文件上传与下载

  1. 上传

下载依赖:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

配置外部下载文件位置

上传文件.png

controller包应用

package com.zking.controller;
​
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
​
import java.io.File;
import java.io.IOException;
import java.lang.invoke.MutableCallSite;
@Controller
public class FileController {
    @RequestMapping("fileupload")
    public String sc(MultipartFile img) {
        try {
            String filename = img.getOriginalFilename();
            System.out.println("文件名" + filename);
            File file = new File("D:/imges", filename);
            img.transferTo(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "file";
    }
}

主配置文件

  • 配置文件上传核心
  • 配置延迟解析
  • 配置上传文件限制
   <!--    文件上传-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <!--     maxInMemorySize  总表单大小
                 maxUploadSize: 单个file大小
                 maxUploadSizePerFile 所有文件的大小
                 单位:字节
         -->
        <property name="maxUploadSizePerFile" value="5242880"></property>
<!--        延迟解析,便于捕获异常
            不开启:进入控制器之前会直接解析请求,如果有错误,就无法进入控制器,不能捕获异常
            开启:进入控制器之后才会解析请求,在控制器中报错,可以捕获异常
    -->
        <property name="resolveLazily" value="true"></property>
    </bean>

测试类

<form action="/fileupload" method="post" enctype="multipart/form-data">
        选择文件: <input type="file" name="img">
        <button>提交</button>
    </form>
<img src="/imges/wallhaven-1k9dew.jpg">

结果:

上传成功.png