第十一次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,如果解析失败,返回错误结果(未登录)

  • 放行

相关推荐
总钻风9571 天前
「IDEA&Alfred Workflow」快捷打开 IDEA 项目
intellij idea
Jaising6662 天前
JetBrains AI 打零工(三)——Junie 常用交互模式分析
ai编程·intellij idea·jetbrains
q_19132846954 天前
基于Springboot+Vue的办公管理系统
java·vue.js·spring boot·后端·intellij idea
5upport4 天前
Gradle Version Catalog的IDE辅助工具
gradle·android studio·intellij idea
Jaising6666 天前
JetBrains AI 打零工(一)——生产力工具与程序员的驾驭之道
ai编程·intellij idea
MacroZheng9 天前
IDEA官方中文文档正式发布,太全了!
java·后端·intellij idea
ApeAssistant10 天前
Idea HttpClient
intellij idea
KK溜了溜了10 天前
JAVA-springboot整合Mybatis
spring boot·mysql·maven·mybatis·intellij idea
舒一笑11 天前
PandaCoder发布-仅以此篇记录人生第一个开源项目
intellij idea
dearxue14 天前
ApiHug 1.3.9 支持 Spring 3.5.0 + Plugin 0.7.4 内置小插件升级 & 儿童节快乐!
spring·api·intellij idea