当前位置: 首页 > backend >正文

JavaWeb学习打卡-Day4-会话技术、JWT、Filter、Interceptor

会话技术

  • 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪方案:
  • 客户端会话跟踪技术:Cookie
    • 优点:是HTTP协议中支持的技术,是官方提供的。
    • 缺点:
      • 移动端APP无法使用Cookie。
      • 不安全,用户可以自己禁用Cookie。
      • Cookie不能跨域。
  • 服务端会话跟踪技术:Session
    • 优点:存储在服务端,安全
    • 缺点:
      • 服务器集群环境下无法直接使用Session。
      • Cookie的缺点。
  • 令牌技术
    • 优点:
      • 支持PC端、移动端。
      • 解决集群环境下的认证问题。
      • 减轻服务器端存储压力。
    • 缺点:需要自己实现。

JWT

JWT简介
  • 全称:JSON Web Token
  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
  • 组成:
    • Header(头):记录令牌类型签名算法等。采用Base64编码。例如:{“alg”:“HS256”,“type”:“JWT”}
    • Payload(有效载荷):携带一些自定义信息默认信息等。采用Base64编码。例如:{“id”:“1”,“username”:“Tom”}
    • Signature(签名):通过指定的签名算法,将header、payload,再加入指定秘钥计算而来。防止Token被篡改,确保安全性。
JWT场景:登录认证
  • 令牌生成:登录成功后,生成JWT令牌,并返回给前端。
  • 令牌校验:后续每个请求,都要携带JWT令牌。在请求到达服务端后,对令牌进行统一拦截、校验。JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的,如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,即令牌非法

过滤器(Filter)

介绍
  • Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
入门
  • 定义Filter:定义一个类,实现 Filter接口,并重写其所有方法。
  • 配置Filter:Filter类上加 @Webfilter 注解,配置拦截资源的路径。引导类(启动类)上加 @ServletComponentScan 开启Servlet组件支持。
    @WebFilter(urlPatterns = "/*")
    public class DemoFilter implements Filter{public void init(FilterConfig filterConfig) throws ServletException {//初始化方法,Web服务器启动,创建Flter时调用,只调用一次。Filter.super.init(filterConfig);}public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain){//拦截到请求时,调用该方法,可调用多次System.out.println("拦截方法执行,拦截到了请求..");chain.dofilter(request,response);}public void destroy(){//销毁方法,服务器关闭时调用,只调用一次Filter.super.destroy();}
    }
    
Filter拦截路径
拦截路径urlPatterns值含义
具体路径/login只有访问 /login 路径时,才会被拦截
目录拦截/emps/*访问/emps下的所有资源,都会被拦截
拦截所有/*访问所有资源,都会被拦截
过滤器链
  • 一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
  • 注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。
    过滤器链执行流程

拦截器(interceptor)

介绍
  • 是一种动态拦截方法调用的机制,类似于过滤器。
  • Spring框架中提供的,用来动态拦截控制器方法的执行。
  • 用来拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
入门
  • 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
    @Component
    public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法执行前执行,返回true:放行,返回false:不放行。public boolean preHandle (HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {System.out.println("preHandle ...");return true;}@Override //目标资源方法执行后执行public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView modelAndView){System.out.println("postHandle ...");}@Override //视图渲染完毕后执行,最后执行public void afterCompletion (HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex){System.out.println("afterCompletion ...");}
    }
    
  • 注册拦截器
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(loginCheckInterceptor).addPathPatterns ("/**");}
    }
    
拦截路径

拦截器拦截路径

执行流程

执行流程

Filter与Interceptor
  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 拦截范围不同:Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源
http://www.xdnf.cn/news/2819.html

相关文章:

  • WPF之Label控件详解
  • GoLand包的爆红问题解决
  • Coupang火箭计划深度攻略:eBay卖家突破韩国市场的三维数据作战模型
  • 面试算法高频08-动态规划-03
  • InitializingBean接口和@PostConstruct-笔记
  • Spring系列四:AOP切面编程 第二部分
  • EasyGBS国标GB28181设备管理软件打造园区安防高效解决方案
  • 【C++】类和对象(4)
  • 开源CMS系统的SEO优化功能主要依赖哪些插件?
  • java 和 C#操作数据库对比
  • Web技术与Apache网站部署
  • 知识付费平台:野兔YeTu
  • 静态库与动态库简介
  • CAD2008无法完成激活注册问题
  • LINE FRIENDS 正式与 Walrus 合作,全新 AI 驱动的游戏即将上线
  • maven私服配置
  • 如何创建并使用极狐GitLab 受保护分支?
  • 明远智睿SSD2351开发板:开启工业控制新征程
  • Linux[开发工具]
  • 短视频矩阵系统贴牌批量剪辑功能开发,支持OEM
  • 马井堂-大语言模型对教学的应用分析
  • C++面试常青客:LRUCache最近最少使用算法
  • 【超详细讲解】什么是序列化和反序列化?
  • Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!
  • STM32 USB配置详解
  • 使用多线程快速向Excel中快速插入一万条数据案例
  • UDP协议详解+代码演示
  • 品融天猫代运营服务内容详解:专业化体系驱动品牌增长
  • Spring Boot 3与JDK 8环境下的单元测试实践指南
  • QT中的多线程