目录
1.基础登录功能
认证:根据用户名和密码校验用户身份的过程。登录成功才可以访问系统中的信息。否则就拒绝访问。
校验:当发起请求时,服务端判断是否登录,如果登录则进行正常的业务操作。(核心)
2.登录校验概述
问题:在登录的界面直接复制访问上面的URL地址,仍然能够访问到,存在不安全的问题。
http协议:无状态的--每一次请求都是独立的 下一次请求并不会携带上一次的请求数据--效率高
浏览器和服务器进行交互--基于http协议
要在服务端判断用户是否已经登录--就需要在员工登录成功之后有一个登录标记(web中的会话技术)
如果一直判断是否完成登录再执行相关操作,就会十分的繁琐---解决方法:统一拦截
拦截浏览器所发送的请求,对请求进行校验,校验员工是否登录
校验方式:获取登录标记---若获取到且没有问题---已经登录--就放行(访问正常的业务接口)
---若未获取或者获取到错误的信息,直接给前端响应一个错误信息,前端自己跳转到登录页面
登录认证:
1.会话技术
会话:浏览器与服务器之间的一次连接
用户打开浏览器第一次访问服务器--会话建立 其中任何一方断开--会话结束 一次会话包含多个请求和响应
浏览器和服务器都没有关闭 请求都是在一次会话当中完成的
会话和浏览器相关联
若多次请求都是来自于同一个会话--就可以在多次请求之间共享数据
2.三种会话技术的对比
1.cookie
存在cookie---之前已经登录完成
服务器会自动的将cookie响应给浏览器 浏览器接收到会自动存储在浏览器本地 后续请求浏览器会自动将cookie携带到服务端
自动化进行:cookie是http协议中支持的技术,各大厂商都支持这一标准
//只要其中任意一个不同--就是跨域cookie不能跨域
//其中 端口号和ip号都不同 属于跨域
2.Session
session--服务器端会话跟踪技术 存储在服务端 底层基于cookie来实现
请求完成--服务器自动创建session对象,session都有对应的id 服务端通过cookie将id响应给客户端浏览器(在响应头当中增加set-cookie这个响应头) 浏览器接收到id值自动存储
//其中 1就是id值
3.令牌技术
令牌技术--用户身份的标识--本质:就是一个字符串 登陆成功--生成令牌--合法技术的凭证 最后将技术响应给前端
浏览器接收到令牌--将令牌存储起来:可以存储在cookie当中 也可存储在其他的存储空间当中
后续的操作都需要将令牌携带到服务端--服务端校验令牌的有效性
要共享的数据存储在令牌当中
令牌技术--主流方案
登录校验
JWT令牌
1.令牌介绍
2.生成和校验
首先要引入依赖
用java代码来解析jwt令牌
此时:已成功解析出来 一旦有误:解析失败 验证了它安全可靠 已经过期的令牌则已失效 不能使用解析
3. 登录后下发令牌
登陆成功 生成jwt令牌 并给前端下发
统一拦截 并校验令牌的有效性:过滤器filter 拦截器interceptor
过滤器filter
快速入门
要访问后面的资源--必须先经过filter 资源访问完毕 又会回到过滤器
init初始化方法--资源及环境的准备操作(只调用一次)
与之对应:destroy资源的释放和环境的清理(服务器关闭时调用 只调用一次)
每次拦截到请求都会调用doFilter这个方法
/*代表所有--指的是当前服务器要拦截所有的请求
package com.itheima.filter; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @Component @WebFilter(urlPatterns = "/*")// /*表示要拦截所有 public class DemoFilter implements Filter { @Override//初始化 只调用一次 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init方法执行了"); } @Override//拦截到请求之后调用 调用多次 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("拦截到了请求"); chain.doFilter(request,response); } @Override//销毁方法 只调用一次 public void destroy() { //Filter.super.destroy(); System.out.println("destroy销毁方法执行了"); } }
详解(执行流程 拦截路径 过滤器链)
放行:让其访问对应的web资源
过滤器链
@WebFilter(urlPatterns = "/*") public class AbcFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("demo拦截到了请求 放行前"); chain.doFilter(request,response); System.out.println("demo拦截到了请求 放行后"); } }
执行的优先级与类名有关系
拦截器Interceptor
快速入门
/**代表拦截所有
详解
Tomcat--servlet容器 只识别servlet
servlet转给controller,先要被拦截器所拦截,对请求进行处理
filter拦截所有 但是intercepter只会拦截进入spring中的
异常处理
标签:令牌,浏览器,javaweb,登录,--,校验,认证,请求 From: https://blog.csdn.net/2301_79144798/article/details/141281889有异常:如何处理?---全局异常处理器--给前端响应统一的结果result,result中封装错误的信息。
这个可以将方法的返回值转化为JSON格式
exception.class(表示要捕获所有的异常)
//result中封装错误的提示信息 最终将result响应给前端