目录
第七章 Web开发
7.3 请求参数处理
7.3.1 请求映射
7.3.1.1 Rest使用与原理
在一个方法上加注解@RequestMapping,来声明这个方法能处理什么请求,这个声明过程就是请求映射。
- Rest风格支持:使用Http请求方式的动词来表示对资源的操作
- 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
- 现在:/user(路径都是一样的) GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
- Rest风格实现的核心Filter:HiddenHttpMethodFilter
-
WebMvcAutoConfiguration类中有一个方法hiddenHttpMethodFilter()
-
OrderedHiddenHttpMethodFilter要继承HiddenHttpMethodFilter
-
用法:表单method=post,使用post请求方式。隐藏域_method=put
-
SpringBoot中手动开启
-
@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
@ConditionalOnProperty(
prefix = "spring.mvc.hiddenmethod.filter",
name = {"enabled"}
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
public class OrderedHiddenHttpMethodFilter extends HiddenHttpMethodFilter implements OrderedFilter {
}
public class HiddenHttpMethodFilter extends OncePerRequestFilter {
private static final List<String> ALLOWED_METHODS;
public static final String DEFAULT_METHOD_PARAM = "_method";
private String methodParam = "_method";//后续可以在自定义的组件中修改这个参数实现自定义名字
//允许put、delete、patch
static {
ALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name()));
}
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest requestToUse = request;
//需要是post请求方式,参数是_method
if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {
//获取_method属性的值
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
//都会转为大写,因此表单中填属性值时大小写均可
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);
}
}
}
//放行新的请求方式
filterChain.doFilter((ServletRequest)requestToUse, response);
}
}
private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {
private final String method;
public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
super(request);
this.method = method;//保存新的请求方式,即从_method中得到的值
}
public String getMethod() {
return this.method;//然后把这个新的请求方式返回
}
}
具体实现:
spring: mvc: hiddenmethod: filter: enabled: true #手动开启该功能
- Rest原理(表单提交使用Rest的时候):总体来看就是用一个过滤器把原生请求的getMethod方法重写了,换成了新的请求方式。
- 表单提交会带上_method&#