Spring MVC请求参数的获取教程指南

 更新时间:2024年10月24日 08:51:06   作者:2的n次方_  
本文介绍了SpringMVC中如何获取各种类型的请求参数,包括基本类型、POJO、数组、集合以及RESTful风格的参数,还讨论了请求参数中文乱码的解决方案,参数绑定的注解如@RequestParam,以及自定义类型转换器的实现,需要的朋友可以参考下

1. 获取 URL 中的参数

获取 URL 中的参数是通过 @PathVariable 注解实现的

@RequestMapping("/article/{articleId}")
public String method12(@PathVariable("articleId") String articleId){
    return "接收到参数articleId: " + articleId;
}

@RequestMapping("/article/{articleId}")大括号中的内容就相当于占位符,可以传入任何参数,但是不能不传

多个参数也是可以接受的:

@RequestMapping("/article/{articleId}/{name}")
public String method12(@PathVariable String articleId,@PathVariable String name){
    return "接收到参数articleId: " + articleId + ", name :" + name;
}

前面也提到过,路径中的参数相当于占位符,不能少传,顺序也必须一致

把 required 改为 false 也不行

2. 上传文件

通过 MultipartFile可以获取文件的对象

@RequestMapping("/m12")
public String method13(MultipartFile file){
System.out.println(file.getOriginalFilename());
return "接收到参数file: " + file.getOriginalFilename();
}

3. cookie 和 session 的介绍

cookie 就相当于这个令牌,当用户首次访问一个网站时,服务器可以在响应中设置 Cookie,并将其发送给客户端浏览器。浏览器会将 Cookie 存储起来。在后续的请求中,浏览器会自动在请求头中携带该网站的 Cookie 信息发送给服务器。服务器通过读取 Cookie 中的数据来识别用户和获取相关状态信息。

Session 是在服务器端用于跟踪用户会话状态的一种机制,当用户首次与服务器建立连接时,服务器会创建一个唯一的 Session ID,并将这个 ID 返回给客户端。客户端通常会将 Session ID 存储在 Cookie 中(也可以通过 URL 重写等方式传递)。在后续的请求中,客户端会携带 Session ID,服务器通过这个 ID 来识别特定的用户会话,并从服务器端的存储中获取相应的 Session 数据。

上面的学生信息中,每一个 session ID 都对应一个 session 对象

例如,用户在进行网上购物时,将商品添加到购物车。服务器会在 Session 中记录购物车的内容。当用户在不同页面浏览或进行结算时,服务器通过 Session ID 找到对应的购物车数据,确保用户的购物操作在整个会话过程中保持一致。

也就是说,第一次没有 session 时会先创建,然后把 session ID 通过 Set-cookie 来给客户端

session 是保存在内存中的,如果重启服务器 session 数据就会消失丢失

cookie 和 session 的区别:

  1. cookie 是客户端保存用户信息的一种机制,session 是服务器端保存用户信息的一种机制
  2. cookie 和 session 之间主要是通过 session ID 关联起来的,session ID 是 cookie 和 session 之间的桥梁
  3. cookie 和session 经常会配合使用,但是不是必须配合,可以用 cookie 来保存一些数据在客户端,不一定是用户身份信息或 session ID,session 中的 session ID 也不一定必须用 cookie 来保存,还可以通过其他来传递,例如通过 URL 来传递

3.1 获取 cookie

先来使用创建 HttpServletRequest 对象来调用 getCookies() 的方法来获取 cookie,因为 cookie 还可能为 null,所以也需要进行判断

//获取cookie
@RequestMapping("getCookie")
public String getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies != null){
    for (Cookie cookie : cookies) {
        System.out.println(cookie.getName() + ":" + cookie.getValue());
    }
}else{
    System.out.println("cookie为空");
}
return "获取cookie成功";
}

在 postman 中添加两个 cookie 值,然后获取 cookie

调用 getCookies() 方法来获取 cookie 的方式是获取所有的 cookie,如果需要获取指定的 cookie 的话还需要遍历,加入判断

通过 @CookieValue 注解使用可以直接获取指定名称的 cookie

@RequestMapping("getCookie2")
public String getCookie2(@CookieValue("name") String name){
    return "从cookie中获取信息,name:" + name;
}

参数名称和 cookie 名是对应的

3.2 获取 session

由于 getSession 方法是先从 cookie 中找到 session ID,然后根据 session ID 获取 session,所以可能出现 session 为 null 的情况,设置为 true 就会创建一个空的 session,设置为 false 就不会创建,默认是 true

在获取 session 对象之前先设置好 session

@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
//获取session对象
HttpSession session = request.getSession();
session.setAttribute("userName","zhangsan");
session.setAttribute("age",18);
return "设置session成功";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
//先从cookie中找到session ID,然后根据session ID获取session
HttpSession session = request.getSession(false);
if(session == null){
    return "获取session为null";
}
String userName = (String) session.getAttribute("userName");
return "从session中获取userName: " + userName;
}

浏览器中先访问 getSession 时,由于还没有设置 session,所以此时还获取不到 session 信息,不过由于用的是 getSession() 方法,如果 session 为空时会创建一个 session,

设置之后就可以正常获取了

如果换个浏览器重新获取就又获取不到了

这就是因为处于不同的会话中,会话的 id 是不同的,这也就是相当于不同用户访问时处于不同的 session 中会获取不同的 session ID

也可以直接传入 HttpSession 对象来获取:

@RequestMapping("/getSession2")
public String getSession2(HttpSession session){
String userName = (String) session.getAttribute("userName");
if(userName !=null){
    return "从session中获取userName: " + userName;
}else {
    return "获取session为null";
}
}

还有一种方式获取就是通过 @SessionAttribute 注解来获取

@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute String userName){
    return "从session中获取userName: " + userName;
}

通过这种方式来获取指定 session ,这个 session 是必须要设置好的,如果不存在的话就会直接报错,要求强制绑定,例如上面的 userName 如果找不到就会报错

3. 获取 header

http 的请求头是有很多个键值对的,可以通过创建 HttpServletRequest 对象来调用 getHeader 方法来获取指定的请求头

@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String User_Agent = request.getHeader("User-Agent");
return "User_Agent: " + User_Agent;
}

还可以通过 @RequestHeader注解来获取

@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String User_Agent){
    return "User_Agent: " + User_Agent;
}

通过 Fiddler 抓包可以看到上传的二进制文件

这里的重命名和上面的是不一样的,这里使用的是 @RequestPart注解

以上就是Spring MVC请求参数的获取教程指南的详细内容,更多关于Spring MVC请求参数获取的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Android系统中的root权限获得原理

    详解Android系统中的root权限获得原理

    这篇文章主要介绍了详解Android系统中的Root权限获得原理,安卓基于Linux,所以原理也相当于Linux中的root用户,需要的朋友可以参考下
    2015-08-08
  • 解决springboot中配置过滤器以及可能出现的问题

    解决springboot中配置过滤器以及可能出现的问题

    这篇文章主要介绍了解决springboot中配置过滤器以及可能出现的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java实战项目 健身管理系统

    Java实战项目 健身管理系统

    本文是一个Java语言编写的实战项目,是一个健身管理系统,主要用到了ssm+springboot等技术,技术含量笔记高,感兴趣的童鞋跟着小编往下看吧
    2021-09-09
  • SpringBoot中的@Component注解源码

    SpringBoot中的@Component注解源码

    在SpringBoot中,@Component注解用于标识一个类为Bean,并由Spring进行管理,它需要配合@ComponentScan注解使用,后者负责扫描包含@Component的类,并进行自动装配,本文给大家介绍SpringBoot中的@Component注解源码,感兴趣的朋友一起看看吧
    2024-01-01
  • java对象持久化保存的方法详解

    java对象持久化保存的方法详解

    这篇文章主要介绍了java对象持久化保存的方法详解,在java应用开发的过程中,经常遇到需要持久保存java对象的情况,比如:用户信息、博客评论内容等等,本文针对java对象的持久化保存方法进行讨论,简述各个方法的优劣,需要的朋友可以参考下
    2023-07-07
  • Spring Security基本架构与初始化操作流程详解

    Spring Security基本架构与初始化操作流程详解

    这篇文章主要介绍了Spring Security基本架构与初始化操作流程,Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
    2023-03-03
  • Springboot转发重定向实现方式解析

    Springboot转发重定向实现方式解析

    这篇文章主要介绍了springboot转发重定向实现方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java方法上注解值修改不成功的问题

    Java方法上注解值修改不成功的问题

    这篇文章主要介绍了Java方法上注解值修改不成功的解决方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Mybatis插入Oracle数据库日期型数据过程解析

    Mybatis插入Oracle数据库日期型数据过程解析

    这篇文章主要介绍了Mybatis插入Oracle数据库日期型数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java中Spring MVC接收表单数据的常用方法

    Java中Spring MVC接收表单数据的常用方法

    Spring MVC是Spring框架中的一个模块,用于开发基于MVC(Model-View-Controller)架构的Web应用程序,它提供了一种轻量级的、灵活的方式来构建Web应用,同时提供了丰富的功能和特性,本文给大家介绍了Spring MVC接收表单数据的方法,需要的朋友可以参考下
    2024-05-05

最新评论