【Spring 】Spring MVC 入门Ⅱ

发布于:2024-05-09 ⋅ 阅读:(31) ⋅ 点赞:(0)

Spring MVC 入门Ⅱ

一、接收Cookie / Session

  1. 这两者都是用来保存用户信息的,但不同的是:

    1. Cookie存在客户端在这里插入图片描述
    1. Session存在服务器
  2. Session产生时会生成一个唯一性的SessionID,这个SessionID可以用于匹配Session和Cookie

  3. SessionID可以在Cookie/Set-Cookie传递,也可以在URL中传递


1. 获取Cookie(获取所有的):

代码:

    @RequestMapping("/r12")
    public String r12(HttpServletRequest request, HttpServletResponse response) {
        // 获取Cookie
        Cookie[] cookies = request.getCookies();
        // 打印
        StringBuilder builder = new StringBuilder();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                builder.append("key: "+cookie.getName() + "  value:" + cookie.getValue()+"\n");
            }
        }

        return "Cookie信息:" + builder;
    }

结果:

在这里插入图片描述

从这个示例中可以看出,Cookie是可以伪造的,所以后端在接收Cookie信息时需要进行Cookie校验

2. 简洁获取Cookie

可以通过@CookieValue注解进行指定cookie的key值进行获取value。

代码:

    @RequestMapping("/r13")
    public String r13(@CookieValue("name") String name) {
        return "r13获取到cookie:" + name;
    }

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、获取Session

1. 理解Session

Session是用于存储用户信息并且保存在服务器端的数据。这个过程是无状态的。

什么是会话?

会话就是客户端与服务器进行的一次建立连接发送数据的过程。

就像在店铺咨询客服一样,每次发起一次咨询的过程就是一次会话。

什么是无状态的

每次发起新的咨询,即使是同一个客服对你进行服务,这个客服仍然不知道你是谁。这个过程是无记忆的,断开连接就“恢复出厂设置了”


2. 获取Session

2.1HttpServletRequest获取
package com.example.springmvcdemo;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/session")
public class SessionController {
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        session.setAttribute("name", "zhangsan");
        return "session设置成功";
    }

    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String name = (String) session.getAttribute("name");
        return "name: "+name;
    }
}

一定要先进行设置Session,再获取Session。

在这里插入图片描述

2.2 HttpSession获取
@RequestMapping("/getSession2")
    public String getSession2(HttpSession session) {
        return "HttpSession获取Session成功:"+session.getAttribute("name");
    }

在这里插入图片描述在这里插入图片描述

2.3 @SessionAttribute获取
 @RequestMapping("/getSession3")
    public String getSession2(@SessionAttribute("name") String name) {
        return "@SessionAttribute获取Session成功:"+name;
    }

在这里插入图片描述
在这里插入图片描述

三、获取Header

3.1 HttpServletRequest获取

代码:

@RestController
@RequestMapping("/header")
public class HeaderController {
    @RequestMapping("getHeader")
    public String getHeader(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        return "HttpServletRequest获取到Header:"+header;
    }
}

结果:
Fiddler抓包:
在这里插入图片描述

3.2 @RequestHeader获取

代码:

    @RequestMapping("getHeader2")
    public String getHeader(@RequestHeader("User-Agent") String ua) {
        return "@RequestHeader获取到Header:"+ua;
    }

结果:

在这里插入图片描述


3.3 设置Header
3.3.1 设置Content-Type

代码:

@RequestMapping(value = "setHeader", produces = "application/json")
    public String setHeader(HttpServletRequest request) {
        return "{key:value}";
    }

在这里插入图片描述

3.3.2 设置状态码

代码:

    @RequestMapping(value = "setStatus")
    public String setStatus(HttpServletResponse response) {
        int status = 345;
        response.setStatus(status);
        return "状态码设置成功: " + status;
    }

结果:

在这里插入图片描述

3.3.3 设置User-Agent

代码:

    @RequestMapping(value = "setHeader2", produces = "application/json")
    public String setHeader2(HttpServletResponse response) {
        response.setHeader("User-Agent", "abc");
        return "{key:value}";
    }

结果:

在这里插入图片描述

3.3.4 添加Header信息

代码:

    @RequestMapping(value = "setHeader3", produces = "application/json")
    public String setHeader3(HttpServletResponse response) {
        response.setHeader("MyHeader", "2024qyy");
        return "{key:value}";
    }

结果:

在这里插入图片描述

四、两个Demo

4.1 计算器

4.1.1 后端接口

响应数据:两数之和

数据类型:text

4.1.2 前端接口

请求路径:user/login

请求方式:get/post

接口描述:计算两数之和

请求参数:

参数 描述 类型 是否必传
num1 加数1 Integer
num2 加数2 Integer

响应数据:两数之和

4.1.3 后端代码
package com.example.springmvcdemo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/calc")
@RestController
public class CalcController {
    @RequestMapping("sum")
    public String sum(Integer num1, Integer num2) {
        Integer sum = num1+num2;
        return "两数之和:"+ sum;
    }
}

4.2 用户登录

4.2.1 后端接口

登录接口:

响应数据:登录是否成功

数据类型:Boolean

获取用户名接口:

响应数据:用户名

数据类型:text

4.2.2 前端接口

登录接口:

请求路径:user/login

请求方式:post

接口描述:验证用户登录是否成功

请求参数

参数 类型 说明 是否必传
userName String 用户名
password String 密码

获取用户名接口:

请求路径:user/index

请求方式:get

接口描述:获取用户名

请求参数:不需要参数

4.2.3 后端代码
package com.example.springmvcdemo.controller;

import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;

@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 用户登录
     * @param userName
     * @param password
     * @param session
     * @return
     */
    @RequestMapping("/login")
    public Boolean login(String userName, String password, HttpSession session) {
        if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {
            return false;
        }

        System.out.println("接收到用户名:"+userName);
        System.out.println("接收到密码:"+password);

        if (!"admin".equals(userName) || !"password".equals(password)) {
            return false;
        }
        // 保存到session中——key一定要带引号
        session.setAttribute("userName", password);
        return true;
    }

    /**
     * 获取登录用户名
     * @param userName 之前保存在Session中的用户名,进行取出
     * @return
     */
    @RequestMapping("/index")
    public String getUserName(@SessionAttribute("userName") String userName) {
        return userName;
    }
}

4.2.4 前端代码:
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>登录页面</title>
</head>

<body>
  <h1>用户登录</h1>
  用户名:<input name="userName" type="text" id="userName"><br>
  密码:<input name="password" type="password" id="password"><br>
  <input type="button" value="登录" onclick="login()">
  
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script>
    function login() {
      $.ajax({
        type: "post",
        url: "/user/login",
        data:{
          userName:$("#userName").val(),
          password:$("#password").val(),
        },
        success:function (result) {
          if (result) {
            location.href = "/index.html";
            alert("跳转成功!");
          }else {
            alert(JSON.stringify(userName));
            alert(JSON.stringify(password));
            alert("用户名或密码错误");
          }
        }
      });
    }

  </script>
</body>

</html>
<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>用户登录首页</title>
</head>

<body>
    登录人: <span id="loginUser"></span>

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <script>
        $.ajax({
            type:"get",
            url:"/user/index",
            success:function (userName) {
                $("#loginUser").text(userName);
            }
        });
    </script>
</body>

</html>

网站公告

今日签到

点亮在社区的每一天
去签到