1) 以前一个小兄弟问我,SpringMVC是否可以使用很多浏览器不支持的(DELETE, HEAD等)请求。
我依稀记得有个Filter可以把请求模拟成Delete方式。我直接回答说org.springframework.web.filter.HiddenHttpMethodFilter可以干这个事情。
2) 今日偶尔看到这个类的源代码发现根本不是如此。它只能将POST请求转换为其他请求。
if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {// 只转换POST求情
String method = paramValue.toUpperCase(Locale.ENGLISH);
HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method);
filterChain.doFilter(wrapper, response);
}
看来以后回答别人的问题还是应该自己先查文档或者看一看源代码,要不然很有可能要出错的。
3) 为了让所有请求都可以模拟成DELETE等请求,只有自己写一个Filter实现和一个HttpServletRequest的装饰器
import java.io.IOException;
import java.util.Locale;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.Assert;
import org.springframework.web.filter.OncePerRequestFilter;
public class HttpMethodSupportFilter extends OncePerRequestFilter {
public static final String DEFAULT_METHOD_PARAM = "_method";
private String methodParam = DEFAULT_METHOD_PARAM;
@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String parameterValue = request.getParameter(methodParam);
if (parameterValue != null) {
String method = parameterValue.toUpperCase(Locale.ENGLISH);
System.out.println(method);
filterChain.doFilter(new HttpServletRequestWrapper(request, method), response);
}
else {
filterChain.doFilter(request, response);
}
}
public void setMethodParam(String methodParam) {
Assert.hasLength(methodParam);
this.methodParam = methodParam;
}
// Servlet装饰器
private static class HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {
private String method;
public HttpServletRequestWrapper(HttpServletRequest request, String method) {
super(request);
this.method = method;
}
@Override
public String getMethod() {
return this.method;
}
}
}
4) 最后一点,如果使用Form提交模拟DELETE请求等时候,要注意到Form是否有文件上传,如果有的话,也不能忘记把
org.springframework.web.multipart.support.MultipartFilter
配置在HttpMethodSupportFilter前面。
分享到:
相关推荐
上传一张图片,同时上传三台服务器 根据不同的节点 上传到不同的服务器上面
SpringMVC后台接收请求参数的几种方式源码。总结了常用的注解,介绍GET和POST请求方式下的参数传递方法。
SpringMVC解决GET请求时中文乱码的问题.rar
springmvc接收ajax请求注意事项
NULL 博文链接:https://yingzhuo.iteye.com/blog/1453438
03.SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢
springmvc+spring线程池处理http并发请求数据同步控制问题
Springmvc请求处理方法参数Springmvc请求处理方法参数
SpringMVC九大常用注解 SpringMVC
SpringMVC请求参数接收 1 GET方法请求参数处理 2 表单参数 3 【非对象】- 非对象类型单个参数接收。 3 【对象】 - 对象类型参数接收。 4 【数组】 - 列表或者数组类型参数。 5 JSON参数 6 URL路径参数 6 文件上传 8 ...
本demo 用来写了springmvc如何接受ajax传集合以及接收form表单传集合
NULL 博文链接:https://cdxs2.iteye.com/blog/1950519
基于SpringMVC以及Spring,Hibernate的非注解入门小demo
NULL 博文链接:https://yingzhuo.iteye.com/blog/1455438
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring...
Java+tomcat+springMVC;实现用户注册及登陆 .没有Service与dao
SpringMVC第6讲:请求转发和重定向
使用Ajax从页面向控制层请求数据,并将提交的数据再次返回,国外网站下载代码,很有参考意义。请使用Eclipse工具
springmvc框架注解和非注解实现,对比两种事项方式差异,理解注解优势。
SpringMVC数据类型转换超详细介绍,注解式控制器的数据验证、类型转换及格式化