Spring Boot登录POST接口如何将JSESSIONID设为可选Cookie参数
要在登录POST接口中接收可选的JSESSIONID Cookie参数,直接使用Spring MVC自带的@CookieValue注解,将其必填属性设为false即可,无需额外配置。
核心实现要点
- 方法参数上添加
@CookieValue(name = "JSESSIONID", required = false)注解,即可自动绑定请求中携带的JSESSIONID值;如果请求未携带该Cookie,参数值会自动赋值为null,不会触发400参数缺失错误。 - 原有代码存在三处问题需要修正:
- Java中字符串值比较不能使用
==(==比较的是对象内存地址),需要使用equals()方法判断内容是否相等 - 登录校验逻辑应该是用户名、密码同时匹配才放行,原代码使用
||(或)会出现单条件满足就登录成功的逻辑漏洞 - 原方法声明返回
ResponseEntity<Account>但构造返回值时未传入Account实例,会出现类型不匹配问题
- Java中字符串值比较不能使用
修正后的完整代码
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController // 组合注解,等价于@Controller + @ResponseBody public class LoginController { @PostMapping("/login") public ResponseEntity<Account> login( @RequestParam(name = "username") String name, @RequestParam(name = "password") String password, // 绑定可选的JSESSIONID Cookie @CookieValue(name = "JSESSIONID", required = false) String jsessionId ) { // 调试用:打印接收到的JSESSIONID,未携带时输出null System.out.println("Received JSESSIONID: " + jsessionId); // 修正字符串比较方式、修正逻辑判断为与条件 if ("user".equals(name) && "password".equals(password)) { System.out.println("Matched!"); Account loginAccount = new Account(); loginAccount.setUsername(name); return new ResponseEntity<>(loginAccount, HttpStatus.OK); } return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } // 示例Account内部类,实际项目中放在独立实体类文件即可 public static class Account { private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } }
扩展说明
如果业务需要直接操作Session对象,不需要手动获取JSESSIONID再查找对应Session,直接在方法参数列表中添加HttpSession session参数,Spring会自动根据请求携带的JSESSIONID关联对应的Session实例,未携带JSESSIONID时会自动创建新Session。
内容的提问来源于stack exchange,提问作者ftslaptop pc
相关产品推荐
相关产品推荐

