Controller页面
使用postman发送POST请求能够返回结果:
能够根据管理者用户名和登录密码验证
登录页面:
输入错误密码或用户名时不能访问
后端控制台返回查询结果为空
输入正确时成功访问到数据
直接访问index2.html时,不能访问到
一、会话技术:用户打开浏览器,访问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依赖
成功生成令牌