spring学习(8)
POST 请求参数
POST 请求请求参数放置在请求体中,有以下两种格式:
- Form Data 格式
请求的 Content-Type 为 application/x-www-form-urlencoded
示例:username=mrjoker&password=123456
- Request Payload 格式
请求的 Content-Type 为 application/json 或者 multipart/form-data
示例:{"username":"mrjoker", "password":"123456"}
- AJAX 提交 POST 请求默认使用 Form Data 格式,Spring MVC 会自动解析到对应的 bean 中并获取参数。
// 逐个参数接收
@RequestMapping(value="/test", method=RequestMethod.POST)
private String test(@RequestParam("username") String username, @RequestParam("password") String password){
return username + password;
}
// 解析为整体接收
@RequestMapping(value="/test", method=RequestMethod.POST)
private String test(User user){
return user.getUsername() + user.getPassword();
}Copy to clipboardErrorCopied
-
Vue 提交 POST 请求默认使用 Request Payload 格式,Spring MVC 接收时必须进行处理:
- 前端解决方案: axios 库可以使用 qs 库将 json 对象转化为 Form Data 格式。
- 后端解决方案: Spring Boot 在请求参数上加
@RequestBody
注解,将请求正文解析到对应的 bean 中获取参数。
@RequestBody
可以直接以 String 接收前端传过来的 json 数据,也可以用对象自动解析前端传过来的 json 数据。对象里定义 List 属性,可用来接收多条 json 数据。
// String 形式接收
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(@RequestBody String user) {
JSONObject userJson = JSON.parseObject(user);
String username = userJson.getString("username");
String password = userJson.getString("password");
return username + password;
}
// 解析为对象接收
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String updateClusterIdByClientAndQueue(@RequestBody User user) {
return user.getUsername() + user.getPassword();
}Copy to clipboardErrorCopied
一个请求可以有多个
@RequestParam
,但只能有一个@RequestBody
。 URL 内含有参数时,两者可以同时使用。
请求转发和重定向
-
请求转发(forward)
客户端(浏览器)向服务器 A 发送一个 URL 请求,服务器 A 会向另一台服务器 B 获取资源并将此资源响应给浏览器。浏览器的 URL 地址仍然是 A 。
-
重定向(Redirect)
客户端(浏览器)向服务器 A 发送一个 URL 请求,服务器 A 告知浏览器资源在服务器 B,浏览器会重新发送请求到服务器 B。浏览器的 URL 地址切换为 B。
// 请求转发
@RequestMapping("/test1")
public String test1(){
String type = 'forward';
return "forward:/test2?type=" + type;
}
// 重定向
@RequestMapping("/test2")
public String test2(){
String type = 'redirect';
return "redirect:/test2?type=" + type;
}Copy to clipboardErrorCopied
在拦截器中,常通过修改 HttpSevletRequest 对象实现请求转发。
request.getRequestDispatcher("login").forward(request,response);Copy to clipboardErrorCopied
Controller 配置
Spring 的 WebMvcConfigurer 接口定义了 Controller 层配置信息(默认为空实现)。
开发者可以通过实现 WebMvcConfigurer 接口或继承 WebMvcConfigurationSupport 类对以下方法进行重写。
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
/** 解决跨域问题 **/
@Override
public void addCorsMappings(CorsRegistry registry){};
/** 添加拦截器 **/
@Override
public void addInterceptors(InterceptorRegistry registry){};
}Copy to clipboardErrorCopied
跨域问题
配置如何处理跨域请求,否则返回数据会被浏览器拦截。
@Override
public void addCorsMappings(CorsRegistry registry) {
// 添加映射路径(全部)
registry.addMapping("/**")
// 放行哪些原始域
.allowedOrigins("*")
// 是否发送 Cookie 信息
.allowCredentials(true)
// 放行哪些原始域(请求方式)
.allowedMethods("GET","POST", "PUT", "DELETE")
// 放行哪些原始域(头部信息)
.allowedHeaders("*")
// 暴露哪些头部信息
.exposedHeaders("Header1", "Header2");
}Copy to clipboardErrorCopied
局部跨域
@CrossOrigin
注解:在方法上(@RequestMapping)或者在控制器(@Controller)上使用,可以实现局部跨域。
@RequestMapping("/hello")
@ResponseBody
@CrossOrigin("http://localhost:8080")
public String index( ){
return "Hello World";
}Copy to clipboardErrorCopied
- 使用 HttpServletResponse 对象添加响应头实现局部跨域。
@RequestMapping("/hello")
@ResponseBody
public String index(HttpServletResponse response){
response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080"); // 指定端口放行
// response.addHeader("Access-Control-Allow-Origin", "*"); 全部放行
return "Hello World";
}
- 点赞
- 收藏
- 关注作者
评论(0)