一、登录校验
- 问题:在未登录情况下,我们也可以直接访问部门管理、员工管理等功能。
- 由于浏览器与web服务器中的数据交互是通过HTTP协议的,而HTTP协议是无状态的–即每个页面中的请求和响应都是独立的,没有状态存在。
- 所以我们需要进行登录校验:
1.登录校验
- 每次访问页面的时候可以用
if...else...
来进行判断用户是否登录。但过程较为繁琐,所以我们设置统一拦截。
二、统一拦截
1.登录标记
(1).会话技术:
- 用户登录成功之后,每一次请求中,都可以获取到该标记。
- 会话:
- 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束在一次会话中可以包含多次请求和响应。
- 会话跟踪:
- 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
(2).会话跟踪方案:
- 客户端Cookie(传统)
- 客户端会话跟踪技术:
Cookie
。
import com.mannor.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;
@Slf4j
@RestController
public class SessionController {
//设置cookie
@GetMapping("/c1")
public Result cookie(HttpServletResponse response) {
response.addCookie(new Cookie("login_username", "mannor"));//设置Cookie/响应Cookie
return Result.success();
}
@GetMapping("/c2")
public Result cookie2(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();//获取所有的Cookie
for (Cookie cookie : cookies) {
if (cookie.getName().equals("login_username")) {//输出name为 login_username 的cookie
System.out.println("login_username: " + cookie.getValue());
}
}
return Result.success();
}
}
优点:HTTP协议中支持
缺点:1.移动端APP无法使用cookie不安全,2.用户可以自己禁用,3.Cookiecookie不能跨域。
- 服务端Session(传统)
- 服务端会话跟踪技术:
Session
,基于cookie开发
import com.mannor.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;
import javax.servlet.http.HttpSession;
@Slf4j
@RestController
public class SessionController {
//往HttpSession中存储值
@GetMapping("/s1")
public Result session1(HttpSession session) {
log.info("attpSession-s1: {}", session.hashCode());
session.setAttribute("loginUser", "tom");//往session中存储数据
return Result.success();
}
//从HttpSession中获取值
@GetMapping("/s2")
public Result session2(HttpServletRequest request) {
HttpSession session = request.getSession();
log.info("HttpSession-s2:{}", session.hashCode());
Object loginUser = session.getAttribute("loginUser");//从session中获取数据
log.info("loginUser: {}", loginUser);
return Result.success(loginUser);
}
}
优点:存储在服务器,安全性高
缺点:1.在服务器集群的情况下无法直接使用Session; 2.Cookie的缺点(基于Cookie开发)。
- JWT令牌技术 (主流技术)
//具体相关内容在下详细介绍
优点:1.支持PC端和移动端 2.解决了集群环境下的认证问题 3.减轻了服务器端存储的压力(不用存储)。
缺点:需要自己实现。