一、表单重复提交
- 该方法判读是否重复提交的原理就是判断发送表单提交时是否有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、测试
- 第一次提交
- 第二次提交
二、文件上传与下载
-
上传
下载依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
配置外部下载文件位置
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">
结果: