首页 > 其他分享 >Rest映射原理

Rest映射原理

时间:2022-10-01 21:40:52浏览次数:44  
标签:HiddenHttpMethodFilter return String 映射 Rest public method 原理 class

  • 查看WebMvcAutoConfiguration,默认配置了OrderedHiddenHttpMethodFilter
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

public static final String DEFAULT_PREFIX = "";

public static final String DEFAULT_SUFFIX = "";

private static final String[] SERVLET_LOCATIONS = { "/" };

@Bean
// 如果没有自定义的组件,则使用默认的组件
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
// 表示该配置需要开启,才能使用rest风格的请求
@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
  • 查看OrderedHiddenHttpMethodFilter
public class OrderedHiddenHttpMethodFilter extends HiddenHttpMethodFilter implements OrderedFilter {
public static final int DEFAULT_ORDER = -10000;
private int order = -10000;

public OrderedHiddenHttpMethodFilter() {
}

public int getOrder() {
return this.order;
}

public void setOrder(int order) {
this.order = order;
}
}
  • 查看HiddenHttpMethodFilter,表示我们需要带1个隐藏的参数项_method
public class HiddenHttpMethodFilter extends OncePerRequestFilter {
private static final List<String> ALLOWED_METHODS;
public static final String DEFAULT_METHOD_PARAM = "_method";
private String methodParam = "_method";

public HiddenHttpMethodFilter() {
}

public void setMethodParam(String methodParam) {
Assert.hasText(methodParam, "'methodParam' must not be empty");
this.methodParam = methodParam;
}
  • Rest原理(表单提交要使用REST的时候)
● 表单提交会带上_method=PUT
● 请求过来被HiddenHttpMethodFilter拦截
○ 请求是否正常,并且是POST
■ 获取到_method的值。
■ 兼容以下请求;PUT.DELETE.PATCH
■ 原生request(post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值。
■ 过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的。
  • 测试
# 前端
测试REST风格;
<form action="/user" method="get">
<input value="REST-GET 提交" type="submit"/>
</form>
<form action="/user" method="post">
<input value="REST-POST 提交" type="submit"/>
</form>
<form action="/user" method="post">
<input name="_method" type="hidden" value="delete"/>
<input value="REST-DELETE 提交" type="submit"/>
</form>
<form action="/user" method="post">
<input name="_method" type="hidden" value="PUT"/>
<input value="REST-PUT 提交" type="submit"/>
</form>

# 后端
@RestController
public class HelloController {

@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
return "GET-张三";
}

@RequestMapping(value = "/user",method = RequestMethod.POST)
public String saveUser(){
return "POST-张三";
}


@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String putUser(){
return "PUT-张三";
}

@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(){
return "DELETE-张三";
}

}

# yml
spring:
mvc:
hiddenmethod:
filter:
enabled: true #开启页面表单的Rest功能
  • 其他写法
@RestController
public class HelloController {

@GetMapping("/user")
public String getUser(){
return "GET-张三";
}

@PostMapping("/user")
public String saveUser(){
return "POST-张三";
}

@PutMapping("/user")
public String putUser(){
return "PUT-张三";
}

@DeleteMapping("/user")
public String deleteUser(){
return "DELETE-张三";
}

}
  • 自定义filter:作用是将_mothod改为自定义字符
# 后端webConfig中配置:
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
methodFilter.setMethodParam("_m");
return methodFilter;
}

# 前端表单中:
<form action="/user" method="post">
<input name="_m" type="hidden" value="delete"/>
<input value="REST-DELETE 提交" type="submit"/>
</form>

# 手动开启HiddenHttpMethodFilter,yml中配置

# 后端控制器:
@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(){
return "DELETE-张三";
}



标签:HiddenHttpMethodFilter,return,String,映射,Rest,public,method,原理,class
From: https://blog.51cto.com/chniny/5728431

相关文章

  • 003.Spring AOP的原理——Spring AOP简介——AOP的核心概念——AOP的2种代理方式——A
    1.6SpringAOP原理SpringAOP通过面向切面技术将与业务无关却为业务模块所共用的逻辑代码封装起来,以提高代码的复用率,降低模块之间的耦合度。SpringAOP将引用分为核心......
  • 004 SpringMVC的原理——主要应对面试官问这个流程哈~
    SpringMVC中的MVC即模型-视图-控制器,该框架围绕一个DispatcherServlet设计,DispatcherServlet会把请求分发给各个处理器,并支持可配置的处理器映射和视图渲染等功能。Sp......
  • E2成都电路板设计_启动保持停止电路的原理
    电气技术分享之2本文介绍电气工程里常见的启动、保持、停止电路的原理。1、起保停电路的功能起保停电路实现的功能:按启动按键,电路的负载得电并保持,按停止按键,负载断电。......
  • 002.Spring IOC的原理——包括:Spring IOC简介——Spring IOC的装配流程——Spring Be
    1.5SpringIOC的原理1.5.1SpringIOC简介Spring通过一个配置文件描述Bean与Bean之间的依赖关系,利用Java的反射功能实例化Bean并建立Bean之间的关系。Spring的IOC容器......
  • Python爬虫基本原理
    1、爬虫是什么爬虫是模拟用户在浏览器或者某个应用上的操作,把操作的过程、实现自动化的程序。当我们在浏览器中输入一个url后回车,后台会发生什么?比如说输入http://www.sina.......
  • Restful中如何传递参数
    HTTP传递参数的三种方式1、URL:适合定位;长度有限2、QueryString:灵活;长度有限3、请求报文体:灵活;长度不限制;不支持GET、DELETEURL:资源定位QueryString:URL之外的额外数据请......
  • 浏览器原理
    参考:https://web.dev/howbrowserswork/https://www.cnblogs.com/zhuanzhuruyi/p/6496276.html1浏览器的作用浏览器的主要作用是呈现web资源,而这些web资源是通过请求一......
  • springboot自动配置原理以及手动实现配置类
    springboot自动配置原理以及手动实现配置类1、原理spring有一个思想是“约定大于配置”。配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot在启动的时候......
  • springboot自动配置原理以及手动实现配置类
    springboot自动配置原理以及手动实现配置类1、原理spring有一个思想是“约定大于配置”。配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot在启动的时......
  • 源码学习之MyBatis的底层查询原理
    导读本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流程,通过本......