【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())

文章目录

获取 Cookie

传统获取 Cookie

这是没有 Spring 的时候,用 Servlet 来获取(获取所有的 Cookie)

  • Spring MVC 是基于 Servlet API 构建的原始 Web 框架,也是在 Servlet 的基础上实现的

    @RequestMapping(“/getcookie”)
    public String getCookie(HttpServletRequest request,
    HttpServletResponse response) {
    //String name = request.getParameter(“name”);
    Cookie cookies[] = request.getCookies();
    if (cookies != null) {
    //将 Cookie 转成了数据流,然后进行循环
    Arrays.stream(cookies).forEach(ck -> System.out.println
    (ck.getName() + “:” + ck.getValue()));
    }
    return “获取Cookie成功”;
    }

  • HttpServletRequest 代表 HTTP 的请求,HTTP 请求里面有什么,这个对象里面就有什么

  • HttpServletResponse 代表 HTTP 的响应,HTTP 响应里面有什么,这个对象里面就有什么
    这两个对象属于 Spring 的内置对象,需要就加上,不用就不用写

Cookie 是一个数组,所以进行循环打印


进入网页后,Cookie 可以直接进行修改(F12)。然后在里面添加信息,name=bitevalue=666,随后保存 image.png|447

之后刷新,可在服务端看到 Cookie 信息 image.png

  • Spring MVC 是基于 Servlet API 构建的原始 Web 框架,也是在 Servlet 的基础上实现的
  • HttpServletRequestHttpServletResponseServlet 提供的两个类,是 Spring MVC 方法的内置对象,需要时直接在方法中添加声明即可
  • HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息
  • HttpServletResponse 对象代表服务器的响应。HTTP 响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等。通过这个对象提供的方法,可以获得服务器响应的所以内容
  • Spring MVC 在这两个对象的基础上进行封装,给我们提供更加简单的使用方法

简洁获取 Cookie(注解)

Spring MVC 在这两个对象的基础上进行封装,给我们提供更加简单的使用方法
上面获取的话,就是获取的所有的 Cookie,而如果想要获取某个 Cookie,就需要使用 @CookieValue

@RequestMapping("/getcookie2")  
public String getCookie2(@CookieValue("bite") String bite) {  
    return "从Cookie中获取值, bite:"+bite;  
}

@CookieValue 里面的值,就是你要获取的 Cookie image.png|448

获取 Session

Session 存储和获取

传统方式也是用 Servlet 进行实现的

@RequestMapping("/getsession")  
public String getsession(HttpServletRequest request) {  
    //从 Cookie 中获取到了 SessionId,根据 Session 获取 Session对象  
    HttpSession session = request.getSession();  
    String name = (String) session.getAttribute("name");  
    return "从session中获取name:"+name;  
}
  • 第四行是从 Cookie 中获取到 SessionId,然后根据 SessionId 获取到 Session 对象
  • 然后通过 getAttribute 来获取你要拿的值

因为 session 是在服务器中进行存储的,所以就不能像前面 Cookie 一样可以直接“伪造”了。就需要学习如何设置 session

@RequestMapping("/setsession")  
public String setSession(HttpServletRequest request){  
    //从 Cookie 中获取到了SessionId,根据 SessionId 获取Session对象
    //如果没有获取到,就会创建一个Session对象  
    HttpSession session = request.getSession();  
    session.setAttribute("name","zhangsan");  
    return "设置session成功";  
}
  • 首先是在 Cookie 中获取 SessionId,然后根据 SessionId 获取 Session 对象。如果没有获取到,就会创建一个 Session 对象
  • 创建好 Session 之后,就可以进行设置了
    • 使用 setAttribute 进行设置,前面是 name,后面是 value

可以通过 Fiddler 进行观察 image.png|455

之后就可以通过 SessionId 获取到 Session 的值了 image.png|522

如果擅自将下面的 SessionId 改了,就获取不到 Sessionimage.png|450


简洁获取 Session (1)

封装一些冗余的过程

@RequestMapping("/getsession2")  
public String getsession2(HttpSession session){  
    String name = (String) session.getAttribute("name");  
    return "从session中获取name"+name;  
}
  • 这里 HttpSession 就直接省略了自己 getSession 的过程,直接就给我们提供了一个 Sessionimage.png|436

简洁获取 Session (2)

更进一步,能直接给到我们想要的 name 的值吗

@RequestMapping("/getsession3")  
public String getsession3(@SessionAttribute("name") String name){  
    //String name = (String) session.getAttribute("name");  
    return "从session中获取name:"+name;  
}
  • 这里的 @SessionAttribute 里面的值就是想要获取的 Session 的值,省略掉了指定 name 的步骤 image.png|511

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-planinvite_code=33sw7qvy0ds04

<think>好的,我现在需要解决用户提到的关于Spring中 '@RequestMapping' 注解不适用于方法形参的问题。首先,我要确认用户的具体情况。根据用户的描述,他们可能在方法的参数上使用了 '@RequestMapping' 注解,但遇到了错误,提示该注解不适用于参数。 首先,我需要回忆一下Spring MVC中 '@RequestMapping' 的正确用法。根据引用[2]中的内容,'@RequestMapping' 是定义在类或方法上的,用于映射HTTP请求到特定的处理方法。而方法参数通常使用其他注解,如 '@RequestParam'、'@PathVariable' 或 '@RequestBody' 等来处理请求参数或路径变量。用户可能混淆了 '@RequestMapping' 的用途,错误地将其应用在方法参数上,导致编译器或框架报错。 接下来,我需要检查用户提供的引用内容。引用[1][2]都提到了 '@RequestMapping' 在类方法上的使用,特别是引用[2]明确指出方法上的 '@RequestMapping' 会缩小类上的映射范围,但没有提到参数上的使用。引用[4]提到 '@RequestParam' 用于处理Servlet请求参数,这进一步说明参数应该使用不同的注解。 因此,用户的问题很可能是因为在方法参数上错误地使用了 '@RequestMapping',而应该使用其他参数级别的注解。例如,正确的做法应该是使用 '@PathVariable' 来处理URL中的变量,或者 '@RequestParam' 来处理查询参数。 接下来,我需要考虑用户可能的错误示例。例如,用户可能写出了类似这样的代码: ```java @RequestMapping("/user") public String getUser(@RequestMapping("id") String id) { // ... } ``` 这里的 '@RequestMapping' 错误地应用在参数 'id' 上,而应该使用 '@PathVariable' 或 '@RequestParam': ```java @RequestMapping("/user/{id}") public String getUser(@PathVariable("id") String id) { // ... } ``` 此外,我需要指出常见的参数注解及其用途,帮助用户正确区分。例如,'@PathVariable' 用于URI模板变量,'@RequestParam' 用于查询参数,'@RequestBody' 用于请求体中的JSON/XML数据,'@RequestHeader' 用于请求头信息,以及 '@ModelAttribute' 用于绑定表单数据等。 同时,需要提醒用户检查Spring框架的版本配置是否正确,确保相关的注解已经被正确导入处理。例如,确认是否在配置中启用了注解驱动(如 `<mvc:annotation-driven/>` 或使用 `@EnableWebMvc`)。 最后,生成相关问题,帮助用户进一步理解如何正确使用这些注解,以及如何处理常见的参数绑定问题。例如,如何从请求中获取参数、处理不同类型的参数、路径变量查询参数的区别等。</think>关于Spring MVC中`@RequestMapping`注解无法应用于方法参数的问题,这里给出分步解决方案: ### 问题根源 `@RequestMapping`是方法/类级别的注解,用于定义请求映射路径,不能直接应用于方法参数[^2][^4]。参数绑定需要使用专用注解如`@RequestParam`或`@PathVariable`。 ### 正确参数绑定方式 1. **路径参数绑定**(REST风格URL) ```java @GetMapping("/users/{userId}") public User getUser(@PathVariable("userId") String id) { // 处理/user/123格式的请求 } ``` 2. **查询参数绑定** ```java @PostMapping("/search") public List<User> search(@RequestParam("keyword") String keyword) { // 处理/search?keyword=xxx的请求 } ``` 3. **请求体绑定**(JSON/XML) ```java @PutMapping("/update") public ResponseEntity<?> updateUser(@RequestBody User user) { // 处理包含JSON请求体的PUT请求 } ``` ### 常见错误示例修正 **错误写法**: ```java @RequestMapping(value = "/profile", method = RequestMethod.POST) public String submitForm(@RequestMapping("user") User user) { // 错误用法 // ... } ``` **正确修改**: ```java @PostMapping("/profile") public String submitForm(@ModelAttribute("user") User user) { // 使用模型绑定 // ... } ``` ### 验证配置步骤 1. 检查是否启用注解驱动: ```xml <mvc:annotation-driven/> <!-- XML配置 --> ``` 或 ```java @Configuration @EnableWebMvc // 注解配置 public class WebConfig implements WebMvcConfigurer {} ``` 2. 确认参数注解的包路径: ```java import org.springframework.web.bind.annotation.RequestParam; // 正确包路径 import org.springframework.web.bind.annotation.PathVariable; ``` ### 其他参数处理注解 | 注解类型 | 应用场景 | 示例 | |-------------------|----------------------------|---------------------------| | `@RequestHeader` | 获取请求头信息 | `@RequestHeader("User-Agent")` | | `@CookieValue` | 读取Cookie值 | `@CookieValue("JSESSIONID")` | | `@SessionAttribute` | 访问会话属性 | `@SessionAttribute("user")` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值