Http是无状态协议:
每一次请求都是独立的,下一次请求并不会携带上一次请求的数据
会话技术
用于同一浏览器的不同请求之间共享数据
会话跟踪:识别多次请求是否来自同一浏览器
客户端会话跟踪技术:Cookie
服务端会话跟踪技术:Session
令牌技术
JWT令牌
对JSON格式的数据进行了安全的封装
Claims类
是ASP.NET Core中的一个类,用于处理和验证身份验证令牌中的声明(claims)。声明是一组键值对,用于描述身份验证令牌的有关信息,例如用户的ID、姓名、角色等。Claims类可以让开发人员轻松地检索和操作身份验证令牌中的声明,以便进行身份验证和授权。
生成jwt令牌
可将输出的jwt令牌复制到 jwt官网 看看是不是想要的样子
报错:java.lang.IllegalArgumentException: secret key byte array cannot be null or empty.
可能是signWith的第二个参数长度太短,设置长一点的即可
解析jwt令牌
setSigningKey(签名密钥)中字符串要与signWith的第二个参数相同,parseClaimsJws中放入jwt令牌要用""引起来
Filter过滤器
注意:实现的Filter接口可以选择jakarta.servlet这个包,然后实现类中的方法,其中init()和destroy()方法都有默认实现,可自行选择是否实现,但是doFilter()方法必须实现
放行语句:filterChain.doFilter(servletRequest,servletResponse);
@WebFilter中urlPatterns
属性值为需要拦截的请求
执行流程:
过滤器链:
执行流程:
登录校验Filter_demo
流程图:
对应步骤:
具体实现:
HttpServletRequest对象
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
HttpServletResponse类
如果需要设置返回给客户端的信息,可以通过HttpServletResponse对象来进行设置,他是通过流来给客户端传递数据的
HttpServletRequest.getRequestURL():
返回客户端发出请求时的完整URL
HttpServletRequest.getHeader(string name):
以 String 的形式返回指定请求头的值。如果该请求不包含指定名称的头,则此方法返回 null。如果有多个具有相同名称的头,则此方法返回请求中的第一个头。头名称是不区分大小写的。
StringUtils.hasLength()
方法可判断字符串是否为null或长度为0,导入的是spring的包
对象转JSON格式
引入依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
调用JSONObject.toJSONString()方法,可在不借用注解的情况下将对象转换为JSON格式的字符串
字符流:HttpServletResponse.getWriter().write("str");
可将字符串str传回前端
如果前端遇到中文乱码的情况,可以在获取的字符流前面调用HttpServletResponse.setContentType(text/html;charset=UTF-8),设置编码格式
jwt如果解析失败会抛出异常,在这里接住并处理
完整代码:
Interceptor拦截器
定义拦截器
目标资源方法即Controller层
Ctrl+O打开实现接口需要重写的方法面板
@Component将拦截器交给IOC容器管理
注册拦截器
@Configuration:放在类前,表明一个类是配置类
@Autowired注入拦截器
.addInterceptor()指定添加拦截器
.addPathPatterns()指定拦截资源
拦截器中指定所有资源为/**而不是/*
拦截路径:
拦截流程:
先由过滤器拦截,因为tomcat是一个servlet容器,识别servlet程序,不识别Controller程序,而在spring web环境中,提供了前端控制器--DispatcherServlet,由其将请求转给Controller程序,而请求又被中间的拦截器拦截
登录校验Interceptor_demo
流程图及步骤与Filter_demo相同,代码也只需要搬过来修改
需注意的是,是否放行逻辑改为return true/false;
方法参数类型不同,获取url,token以及写入字符流不再需要强转
具体代码如下:
Filter与Interceptor
拦截器是由spring提供的
异常处理
防止因为出现的异常而导致返回给前端的结果格式不是统一的响应结果Result格式,而导致前端无法解析出现问题,因此定义全局异常处理器
声明一个java类,一般放在exception包中
@RestControllerAdvice:放在类前,表明类为全局异常处理器。@RestControllerAdvice=@ControllerAdvice+@ResponseBody
@ExceptionHandler:放在方法前,Value属性指定需要处理的异常类型