spring学习(8)

举报
幼儿园老大* 发表于 2024/09/27 21:33:21 2024/09/27
【摘要】 POST 请求参数POST 请求请求参数放置在请求体中,有以下两种格式:Form Data 格式请求的 Content-Type 为 application/x-www-form-urlencoded示例:username=mrjoker&password=123456Request Payload 格式请求的 Content-Type 为 application/json 或者 multi...

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"}

  1. 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
  1. 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 内含有参数时,两者可以同时使用。

请求转发和重定向

  1. 请求转发(forward)

    客户端(浏览器)向服务器 A 发送一个 URL 请求,服务器 A 会向另一台服务器 B 获取资源并将此资源响应给浏览器。浏览器的 URL 地址仍然是 A 。

  2. 重定向(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

局部跨域

  1. @CrossOrigin 注解:在方法上(@RequestMapping)或者在控制器(@Controller)上使用,可以实现局部跨域。


@RequestMapping("/hello")
@ResponseBody
@CrossOrigin("http://localhost:8080") 
public String index( ){
    return "Hello World";
}Copy to clipboardErrorCopied
  1. 使用 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";
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。