第十次课后作业-登录验证实现

Controller页面

使用postman发送POST请求能够返回结果:

033886d1b4e340169a6c66822399c8cb.png

能够根据管理者用户名和登录密码验证

92155ce6b6f942dd80b97f6a3a795ea0.png

登录页面:

输入错误密码或用户名时不能访问

a65e7ece0910404d9b2dfab6117b4859.png

1607901892f84dd684c9ab308baf7e86.png

后端控制台返回查询结果为空

370865e936534bcd867f9a6fc39e51b6.png

输入正确时成功访问到数据

e92d2721efc74ef69466794b6eb66fc4.png

b9a4e5f1a4b4455ba91a1bcc840824d2.png

78ecd20c0a0946c280c445fd5619bdd7.png

直接访问index2.html时,不能访问到

ca0dfdd03824419b85dc61d2a086f7ae.png

一、会话技术:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束,在一次会话中可以包含多次请求和响应。

二、会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话多次请求中共享数据

(获取验证码的请求和登陆的请求 在一次会话中的两次请求中 共享数据)

三、会话跟踪技术:
1、客户端会话跟踪技术:Cookie  -- 存储在客户端浏览器当中

2、服务端会话跟踪技术:Session  --存储在服务器当中

3、令牌技术

四、Cookie: 服务器自动将 Cookie响应头 给浏览器(Set-Cookie:name=value),浏览器接收到Cookie后会自动保存在浏览器本地,在后续请求当中浏览器会自动携带 Cookie请求头(Cookie:name=value) 到服务器端

Cookie不能跨域。跨域的三个维度:协议、IP/域名、端口,有任何一个不同就是跨域

服务器端响应给浏览器端所设置的Cookie信息,浏览器自动解析响应头,将set-Cookie中的值存储在浏览器本地

浏览器进行新的访问请求时会把 cookie请求头信息携带到服务端

package com.wust.controller;
import com.wust.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@Slf4j
public class Cookie_SessionController {

    // 设置Cookie -- 服务器给浏览器响应数据
    @GetMapping("/cookie1")
    public Result cookie1(HttpServletResponse response){
        response.addCookie(new Cookie("username","123456"));
        return Result.success();
    }

    // 获取Cookie -- 获取浏览器在请求头中携带的数据
    @GetMapping("/cookie2")
    public Result cookie2(HttpServletRequest request){
        Cookie[] cookies = request.getCookies(); // 获取到的是所有的Cookie
        for (Cookie cookie:cookies) {
            if (cookie.getName().equals("username")) {  // 输出name为username的Cookie
                System.out.println("username:" + cookie.getValue());
            }
        }
        return Result.success();
    }
}

五、Session--基于Cookie的会话技术

存储在服务器端,更安全,但是服务器集群环境下无法直接使用session,同一个浏览器发起多次请求获取到的不是同一个会话对象,也包含cookie的缺点

示例

服务器端session对象的id,浏览器接收到后会将其存储起来

发送新的请求时,浏览器会携带session对象的id到服务端,服务端接收到id值后会根据该id值找到这次请求对应的session会话对象。

idea中显示两次请求的会话session对象是同一个

@RestController
@Slf4j
public class Cookie_SessionController {

    // 向HttpSession中存储值
    @GetMapping("session1")
    public Result session1(HttpSession session){
        log.info("HttpSession-s1:{}",session.hashCode());
        session.setAttribute("username","Tom");
        return Result.success();
    }

    // 从HttpSession中获取值
    @GetMapping("session2")
    public Result session2(HttpServletRequest request){
        HttpSession session = request.getSession();
        log.info("HttpSession-s2:{}",session.hashCode());

        Object username = session.getAttribute("username");
        log.info("username:{}",username);
        return Result.success(username);
    }

}

六、JWT(JSON Web Token)令牌

定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息,由于数字签名的存在,这些信息是可靠的。

组成:

1、Header(头),记录令牌类型、签名算法等;{"alg":"HS256","type":"JWT"} Base64编码

2 Payload(有效载荷),携带一些自定义的信息 默认信息等;{"id":"1","username":"Tom"}Base编码

3、Signature(签名),防止Token被篡改、确保安全性,融入Header、payload,并加入指定密钥,通过指定签名算法计算而来

优点:支持PC端、移动端、解决集群环境下认证问题、减轻服务器端口存储压力(不需要在服务器端存储数据) 缺点就是需要自己实现令牌

过程:用户登录完成后生成一个JWT令牌,并将其下发给客户端,客户端存储该令牌,在之后的每一次请求中都将这个令牌携带到服务器端,服务器端接受这个请求后对请求进行统一拦截,获取请求中携带的令牌,校验令牌的真伪,令牌无效直接相应错误结果,令牌有效访问对应业务接口。

JWT令牌的生成:

1、pom.xml中加入依赖

2、测试JWT令牌  返回了一个jwt令牌

3、JWT令牌的解析

JWT校验使用的签名密钥必须和生成JWT令牌使用的密钥是配套(也就是这里的wust必须一致)

当JWT令牌解析校验时报错,说明令牌被篡改或失效了,令牌非法

postman发送请求测试 出现500状态码的错误,解决办法是引入一个jaxb-api依赖

成功生成令牌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值