第十一次Javaweb作业

4.登录校验

4.1会话

--用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一个浏览器,以便在同一次会话的多次请求间共享数据--

  • cookie客服端会话跟踪技术(addCookie(name,value),getCookie方法)

    优点:HTTP协议中支持的技术

    缺点:移动端APP无法使用Cookie,不安全用户可以自己禁用Cookie,Cookie不能跨域。(跨域区分三个维度:协议,IP/域名,端口)

  • Session服务端会话跟踪技术(addAttribute(name,value),setAttribute(name,value),getAttribute(name)方法)

    优点:存储在服务端,安全

    缺点:服务器集群环境下无法使用Session+Cookie缺点

  • 令牌技术

    优点:支持PC端,移动端。解决集群环境下的认证问题。减轻服务端存储压力。

    缺点:需要自己实现

4.2JWT令牌技术

--简洁、自包含的格式,用于在通信双方以JSON数据格式安全的传输信息。由于数字签名的存在,这些信息都是可靠的。

组成:

第一部分:Header(头),记录令牌类型、签名算法等。例如:["alg":"HS256","type":"WT")

第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。例如:"id"."1""username"."Tom"

第三部分: Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

​ *第三部分字符的由来不是Base64编码方式生成的,而是前面指定的签名算法

应用场景-- 登录认证

① 用户登录成功后,服务端生成一个JWT令牌,并传输给前端。

②前端拿到JWT令牌之后会将其存储起来,之后前端的每一次请求都会将JWT令牌携带到服务端,服务端会对请求进行统一拦截,拦截之后先判断有没有把这个令牌带过来。

​ 如果没有令牌就拒绝访问;若有令牌但是无效仍然拒绝访问;若有效则直接放心,并处理对应请求

*JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的(编码和解析时秘钥必须相同)

*如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效,令牌非法

登录成功下发令牌令牌生成: 登录成功后,生成JWT令牌,返回给前端令牌校验,在请求到达服务端后,对令牌进行统一拦截、校验用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为token,值为登录时下发的JWT令牌

4.3Filter

--Filter过滤器,是javaWeb三大组件(Servlet、Filter、Listener)之一

  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能

​ ① 想要访问服务器中的某些资源,必须先经过Filter过滤器。

​ ② 再此处进行一些操作,完成之后进行放行,访问对应的资源

​ ③ 资源访问完毕,最后再回到过滤器,然后再给浏览器响应对应的数据

  • 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

​ 如果没有过滤器,我们需要在每一个接口中编写登录校验逻辑。

​ 如果登录了,放行去访问对应的信息,如果没有登录,直接在Filter中返回错误信息,不再访问后面的请求

  • 定义Filter:定义一个类,实现Filter接口,并重写其所有方法

但是开发中我们一般只实现doFilter这个方法,其他两个方式使用默认实现即可

  • 配置Filter:Filter类上添加@WebFilter注解,配置拦截资源路径。引导类上添加@ServletComponentScan注解开启Servlet组件支持

执行流程:当我们的过滤器拦截到请求之后我们需要完成一个非常重要的操作,那就是放行

放行"就是让其去访问对应的web资源,访问完过滤器之后还会回到过滤器当中,执行"放行"语句后面的代码,执行完毕之后再给浏览器响应数据 。

拦截路径:在快速入门中配置的是 /*,代表拦截所有请求

拦截路径 urlPatterns 含义
拦截具体路径 /login 只访问/login路径时才会被拦截
目录拦截 /emps/* 访问/emps下的所有资源,都会被拦截
拦截所有 /* 访问所有资源,都会被拦截

过滤器链:一个web应用中,可以配置多个过滤器,多个过滤器形成了一个过滤器链。​ 过滤器链中的过滤器会一个一个的执行,第一个放行之后会执行第二个,依次推,最后一个过滤器执行完后会访问对应请求。

​ 过滤器链中最后一个过滤器放行的话,会放行到web资源当中来访问web资源

​ 访问完资源后,是倒着进行的,先执行最后一个过滤器,再倒数第二个....

登录校验过滤器:

备注说明:

用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为token,值为登录时下发的JWT令牌。

如果检测到用户未登录,则会返回如下固定错误信息。

实现思路:

  • 获取请求url

  • 判断请求url中是否包含login,如果包含,说明是登录操作,放行

  • 获取请求头中的令牌(token)

  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)

  • 解析token,如果解析失败,返回错误结果(未登录)

  • 放行

代码实现:在过滤器当中为什么要把ServletRequest类型强转成HttpServletRequest类型?

在Java中,ServletRequest是一个接口,它是由Servlet容器提供的。HttpServletRequest接口则是ServletRequest接口的子接口,它包含了一些用于HTTP协议的方法和属性。在Java Web应用程序中,Servlet容器实现了ServletRequest和HttpServletRequest接口,并使用HttpServletRequest实现了HTTP协议相关的逻辑。

在开发Web应用程序时,Servlet容器将在每个客户端请求到达时创建一个ServletRequest对象并将其传递给请求处理器。由于具体的实现是由Servlet容器提供的并且通常是HttpServletRequest,因此在编写Servlet处理器时,我们通常将ServletRequest对象强制转换成HttpServletRequest对象,以便能够调用提供的HTTP协议相关方法。

因此,在过滤器中,如果我们需要使用HttpServletRequest接口中特定的HTTP协议相关方法,我们需要将ServletRequest对象强制转换成HttpServletRequest对象。这样我们才能够在处理ServletRequest对象时,使用HttpServletRequest中更多的方法和属性。

4.4Interceptor - 拦截器

--是一种动态拦截方法调用调用机制,类似过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行(拦截请求的)

作用: 拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码

拦截路径:

addPathPatterns 指定拦截哪些路径

excludePathPatterns 执行不拦截哪些不经

/*:一级路径-能匹配/depts,/emps,/login,不能匹配/depts/1/**:任意级路径-能匹配/depts/1,/depts,/depts/1/2/depts/* :/depts下一级路径-能匹配/depts/1,不能匹配/depts,/depts/1/2,/depts/depts/**:/depts下的任意路径-能匹配/depts,/depts/1,/depts,/depts/1/2

执行流程:① 当浏览器向Web服务器发送请求时,我们所设定的过滤器会拦截到这一请求。

② 过滤器先执行放行前逻辑,在此处决定是否放行

③ 放行之后进入到Spring环境中,进入DispatcherServlet

​ 在请求响应时说道,tomcat服务器并不识别我们所编写的controller程序,但是他是识别Servlet程序的,因为tomcat是一个Servlet程序。

​ 而在SpringWeb当中提供了一个非常核心的Servlet,我们叫做DispatcherServlet前端核心控制器,所以请求会先进入到DispatcherServlet,请求由DispatcherServlet再传给Controller

​ 如果设置了拦截器的话,DispatcherServlet在传给Controller之前需要先被拦截器拦截住

④ 拦截器拦截到,先进行preHandle,决定是否放行,如果放行便访问Controller层方法

⑤Controller层方法完成之后,再执行postHandler方法已经afterCompletion方法

⑥返回给DispatcherServlet

⑦最终执行放行后逻辑

⑧最终给浏览器响应数据

过滤器与拦截器的区别:

  • 接口规范不同:过滤器实现Filter接口,而拦截器需要实现HandlerInterceptor接口

  • 拦截范围不同 :过滤器Filter会拦截所有资源,而Interceptor只会拦截Spring环境中的资源,过滤器拦截范围更大

登录校验拦截器实现思路:与过滤器思路一模一样

  • 获取请求url

  • 判断请求url中是否包含login,如果包含,说明是登录操作,放行

  • 获取请求头中的令牌(token)

  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)

  • 解析token,如果解析失败,返回错误结果(未登录)

  • 放行

相关推荐
碎像17 小时前
使用AI工具 Baidu Comate 辅助编码 快速定位修改Bug
java·前端·后端·bug·intellij idea
vivo互联网技术5 天前
vivo 互联网自研代码评审 VCR 落地实践
git·gitlab·intellij idea
庄周de蝴蝶5 天前
IntelliJ IDE 插件开发 | (十一)解析 Mybatis 的控制台 SQL 日志
后端·kotlin·intellij idea
碧玉笙6 天前
MavenPlus插件的基础功能完善
maven·idea·intellij idea
DN金猿7 天前
idea或vscode支持vue语法,ts可解析*.vue
ide·vue.js·vscode·intellij idea·webstorm
咖喱年糕7 天前
【Git】分布式版本控制工具
intellij idea·git 基本概念·git 工作流程概述·常用 git 命令·git 代码托管服务·分布式版本控制工具
zxguan11 天前
IDEA 学习之 启动“卡死”
intellij-idea·intellij idea
庄周de蝴蝶12 天前
IntelliJ IDE 插件开发 | (十)主题插件开发入门
后端·kotlin·intellij idea
DaveCui21 天前
mac 本地连接cat配置
后端·intellij idea