`

SpringMVC杂记(九) 模拟其他类型(非GET,POST)的请求

 
阅读更多
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 服务器端模拟浏览器发送请求,传递图片与文件到不同的服务器

    上传一张图片,同时上传三台服务器 根据不同的节点 上传到不同的服务器上面

    SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

    在本篇博文中,我们将深入探讨SpringMVC框架中的向导型Controller的实现,这是SpringMVC 3.1.1版本的一个重要特性。向导型Controller通常用于处理多步骤的用户交互流程,如购物车结账、用户注册等,它能够引导用户...

    Http请求传参SpringMVC接收参数详细解析

    本文将深入解析SpringMVC如何处理GET和POST请求中的参数,以及如何使用@RequestParam和@RequestBody注解。 1. GET请求 GET请求通常用于获取资源,其参数直接附加在URL路径后面,以键值对的形式存在。例如,`/api/...

    springmvc接收ajax请求注意事项

    SpringMVC 接收 Ajax 请求注意事项 SpringMVC 框架在处理 Ajax 请求时需要注意一些重要的配置和设置,以确保请求的正确处理和数据的正确传输。下面我们将介绍在 SpringMVC 中接收 Ajax 请求的注意事项。 基本数据...

    springMVC使用Ajax请求数据

    - 使用jQuery的`$.ajax()`或`$.get()`、`$.post()`方法发起Ajax请求。例如,一个简单的GET请求可能如下所示: ```javascript $.ajax({ url: '/springmvc/ajax', // SpringMVC的Controller处理路径 type: 'GET',...

    SpringMVC杂记(五) JSR303数据验证

    在本篇《SpringMVC杂记(五) JSR303数据验证》中,我们将深入探讨SpringMVC框架如何集成并使用JSR303(JavaBeans Validation)来进行数据验证,这是一种强大的验证机制,可以确保应用程序接收到的数据是合法且符合...

    SpringMVC后台接收请求参数的几种方式Demo

    我们将重点关注GET和POST请求,这两种请求方式在Web开发中最为常见。以下是对每种方式的详细说明: 1. **路径变量(Path Variables)** 在Spring MVC中,我们可以使用`@PathVariable`注解来捕获URL模板中的动态...

    SpringMVC接收请求参数所有方式总结

    表单数据通常以POST请求的方式发送,SpringMVC会自动将这些参数绑定到控制器方法的参数上。对于简单类型,如`long`、`int`等,可以使用`@RequestParam`注解。对于复杂对象,可以直接作为方法参数,Spring会尝试将...

    SpringMVC PPT_springmvc_

    SpringMVC 也支持 RESTful 风格的 Web 服务,可以通过 @RequestMapping 注解配合 HTTP 方法(GET、POST、PUT、DELETE 等)来创建符合 REST 规范的 API。 十二、单元测试 SpringMVC 提供了 MockMVC 工具,可以方便地...

    SpringMVC九大常用注解

    - **method**: 指定处理请求的方法类型(GET、POST等)。 2. **consumes/produces**: - **consumes**: 指定请求的Content-Type,如application/json。 - **produces**: 指定返回的Content-Type。 3. **params/...

    SpringMVC框架下使用jQueryAJAX进行数据交互

    然后,使用jQuery的`.ajax()`方法或更简单的`.get()`、`.post()`方法发起AJAX请求。例如: ```javascript $.ajax({ type: 'POST', url: '/ajax', // 对应控制器中的方法 data: {key: 'value'}, // 发送的数据 ...

    springMVC入门框架(非注解)

    9. **请求映射**:通过@RequestMapping注解,你可以为不同的HTTP请求方法(GET、POST等)设置不同的处理逻辑。例如,`@RequestMapping("/hello")`表示处理所有发往/hello的请求。 10. **模型绑定**:Spring MVC支持...

    SpringMVC数据绑定及数据类型转换

    **数据绑定**是SpringMVC中的一种机制,允许我们将用户通过表单或其他方式提交的请求参数自动绑定到控制器中的方法参数或者模型对象的属性上。这种绑定过程极大地简化了开发者的工作,无需手动从请求中获取每个参数...

    SpringMVC详解

    随着版本的更新,SpringMVC不断引入新的特性和改进,例如SpringMVC 3.1中的生产者、消费者请求限定,增强了对请求类型的控制,使得API设计更加灵活。 以上只是SpringMVC框架的部分内容,实际使用中还包括视图模板...

    java springmvc

    在实际项目中,SpringMVC可以与其他技术结合,如MyBatis、RESTful API等,构建复杂的企业级应用。理解并熟练掌握SpringMVC的这些核心概念和功能,对于提升开发效率和代码质量具有重要意义。同时,持续关注Spring框架...

    springMVC_day01.xmind

    SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring...

    非注解Springmvc+spring+hibernate 入门实例

    SpringMVC作为Spring的一部分,专门用于处理Web层的请求,而Hibernate则是一个强大的对象关系映射(ORM)框架,简化了数据库操作。下面我们将深入探讨"非注解SpringMVC+Spring+Hibernate入门实例"中的关键知识点。 ...

    SpringMVC映射请求.rar

    SpringMVC映射请求

    模拟springMVC跳转源码

    `@RequestMapping`可以接受多个参数,如`value`、`method`等,分别用于指定请求的URL和HTTP方法(GET、POST等)。 模拟Spring MVC跳转: 在模拟Spring MVC的跳转过程中,我们通常会使用`ModelAndView`或`...

Global site tag (gtag.js) - Google Analytics