使用Java登录校验

会话技术

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

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

        会话跟踪方案:

                客户端会话跟踪技术:Cookie

                服务端会话跟踪技术:Session

                令牌技术

会话跟踪方案对比:

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

缺点:移动端APP无法使用Cookie

          不安全,用户可以自己禁用Cookie

          Cookie不能跨域

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

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

                   Cookie的缺点

        优点:支持PC端、移动端

                   解决集群环境下的认证问题

                   减轻服务器端存储压力

           缺点:需要自己实现

JWT令牌

        全称:JSON Web Token

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

        组成:

                第一部分:Header(头),记录令牌类型,签名算法等。

                                例如:{"alg":"HS256","type":"JWT"}

                第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。

                                例如:{"id":"1","usename":"Tom"}

                第三部分:Signature(签名),防止Token被篡改、确保安全性。

                                将header、payload,并加入指定密钥,通过指定签名算法计算而来

JWT

        场景:登录认证

                1.登录成功后,生成令牌

                2.后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,同过后,再处理。

向pom.xml引入依赖:

 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
    @Testpublic void testGenJwt() {Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("name", "tom");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "itbignyi").setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)).compact();System.out.println(jwt);
@Testpublic void testParseJwt() {Claims claims = Jwts.parser().setSigningKey("itbignyi").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5NDUzMjAwOH0.D4TjgQSvqZJlUNioEKxUn8euvxu9gqnSo4jfsJGuL7Q").getBody();System.out.println(claims);

注意事项:JWT校验时使用的签名密钥,必须和生成JWT令牌时使用的密钥时匹配的。

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

将代码写入:

过滤器Filter

概念:Filter过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一

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

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

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

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

package com.itheima.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {Filter.super.destroy();}
}

 Filter拦截路径:

        Filter可以根据需求,配置不同的拦截资源路径:

过滤器链:

        介绍:一个Web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链

        顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序

 登录校验

        登录校验Filter-流程:

 1.获取请求url2.判断请求url中是否包含login,如果包含,说明登录操作,放行3.获取请求头中的令牌(token)4.判断令牌是否存在,如果不存在,返回错误结果(未登录)5.解析token,如果解析失败,返回错误结果(未登录)6.放行

package com.itheima.filter;import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import javax.imageio.spi.ServiceRegistry;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Slf4j
@WebFilter(urlPatterns = "/*")public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse res = (HttpServletResponse) servletResponse;
//         1.获取请求urlString url = req.getRequestURI().toString();log.info("请求的url:{}", url);
//         2.判断请求url中是否包含login,如果包含,说明登录操作,放行if (url.contains("login")) {log.info("登录操作,放行...");filterChain.doFilter(servletRequest,servletResponse);return;}
//         3.获取请求头中的令牌(token)String jwt = req.getHeader("token");
//         4.判断令牌是否存在,如果不存在,返回错误结果(未登录)if (!StringUtils.hasLength(jwt)) {log.info("请求头token,为空,返回未登录的信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);res.getWriter().write(notLogin);return;}
//         5.解析token,如果解析失败,返回错误结果(未登录)try {JwtUtils.pareJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析失败");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);res.getWriter().write(notLogin);return;}
//         6.放行log.info("合法放行");filterChain.doFilter(servletRequest, servletResponse);}
}

拦截器Interceptor

概述:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行

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

Interceptor快速入门

1.定义拦截器,实现HandlerInterceptor接口,并重写其所有方法

2.注册拦截器

package com.itheima.config;import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration  //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}}
package com.itheima.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

拦截器-拦截路径

        拦截器可以根据需求,配置不同的拦截路径

拦截器-执行流程

 Filter和Interceptor

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

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

 运行代码:

package com.itheima.interceptor;import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {//         1.获取请求urlString url = req.getRequestURI().toString();log.info("请求的url:{}", url);
//         2.判断请求url中是否包含login,如果包含,说明登录操作,放行if (url.contains("login")) {log.info("登录操作,放行...");return true;}
//         3.获取请求头中的令牌(token)String jwt = req.getHeader("token");
//         4.判断令牌是否存在,如果不存在,返回错误结果(未登录)if (!StringUtils.hasLength(jwt)) {log.info("请求头token,为空,返回未登录的信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);res.getWriter().write(notLogin);return false;}
//         5.解析token,如果解析失败,返回错误结果(未登录)try {JwtUtils.pareJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析失败");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);res.getWriter().write(notLogin);return false;}
//         6.放行log.info("合法放行");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

异常处理

全局异常处理器

package com.itheima.exception;import com.itheima.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class GlobalExceptionhandler {@ExceptionHandler(Exception.class)public Result ex(Exception ex) {ex.printStackTrace();return Result.error("操作失败,联系管理员");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iptables 目标地址转换

目录 一、实验准备 二、配置web服务器 三、配置web防火墙网卡 四、配置客户机网卡 五、测试 1、开启防火墙功能&#xff0c;设置源地址转换&#xff0c;通过改变我客户机的地址身份为web服务器同网段来实现访问 2、通过改变目标地址&#xff08;客户机&#xff09;的地址…

算法通关村18关 | 透析回溯的模板

回溯有清晰的解题模板&#xff0c; void backtracking(参数){if (终止条件){存放结果;return;}for (选择本层中的集合元素&#xff08;画成树&#xff0c;就是树节点孩子的大小) {处理节点;backtracking();回溯&#xff0c;撤销处理结果;}} 1. 从N叉树说起 在回溯之前&#x…

【C++】常用排序算法

0.前言 1.sort #include <iostream> using namespace std;// 常用排序算法 sort #include<vector> #include<algorithm>//利用仿函数 打印输出 class myPrint { public:void operator()(int val){cout << val << " ";} };//利用普通函…

OSCP系列靶场-Esay-Vegeta1保姆级

OSCP系列靶场-Esay-Vegeta1保姆级 目录 OSCP系列靶场-Esay-Vegeta1保姆级总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试22-SSH端口的信息收集22-SSH端口版本信息与MSF利用22-SSH协议支持的登录方式22-SSH手动登录尝试(无)22-SSH弱口令…

GDB的C++调试方法

本文记录基础的GDB调试过程&#xff0c;包含指令如下&#xff1a; 文章目录 准备编译文件GDB启动GDB开启代码行设置断点运行程序查看pc的指令查看监视的变量以及断点设置快照checkpoint实验1实验2 nextnextistepx/i $pcfinishinfo break 和 delete Numrefbreak col. if condit…

下载配置 maven并在 idea 上应用

目录 一 maven 定义 二 Maven特点 三 Maven仓库 四 安装配置maven 步骤一:准备安装包,解压 步骤二:配置maven的环境变量 步骤三:测试maven的环境变量是否配置成功 步骤四:配置maven本地仓库 步骤五:阿里云、腾讯镜像配置 步骤六:全局配置idea的maven路径 步骤七:创建…

浅谈C++|STL之map篇

一.map 1.1map概念 简介: map中所有元素都是pairpair中第一个元素为key(键值)&#xff0c;起到索引作用&#xff0c;第二个元素为value(实值)所有元素都会根据元素的键值自动排序 本质: . map/multimap属于关联式容器&#xff0c;底层结构是用二叉树实现。 优点: 可以根…

CocosCreator3.8研究笔记(十)CocosCreator 图像资源的理解

一、图像资源导入 Cocos Creator 可使用图像文件格式&#xff0c;支持 JPG、PNG、BMP、TGA、HDR、WEBBP、PSD、TIFF 等。 将图像资源直接拖拽到 资源管理器 即可将其导入 二、图像资源的类型 在 属性检查器 面板中便可根据需要设置图像资源的使用类型&#xff1a;raw 、 textu…

为什么需要 TIME_WAIT 状态

还是用一下上一篇文章画的图 TCP 的 11 个状态&#xff0c;每一个状态都缺一不可&#xff0c;自然 TIME_WAIT 状态被赋予的意义也是相当重要&#xff0c;咱们直接结论先行 上文我们提到 tcp 中&#xff0c;主动关闭的一边会进入 TIME_WAIT 状态&#xff0c; 另外 Tcp 中的有 …

软件设计师学习笔记9-进程调度

目录 1. PV操作 1.1进程的同步与互斥 1.1.1互斥 1.1.2同步 1.2 PV操作 1.2.1信号量 1.2.2 PV操作的概念 2.信号量与PV操作 2.1 PV操作与互斥模型 2.2 PV操作与同步模型 2.3 互斥与同步模型结合 3.前趋图与PV操作 1. PV操作 1.1进程的同步与互斥 1.1.1互斥 互斥&…

Kubernetes Dashboard安装部署

Kubernetes Dashboard安装部署 1. 下载Dashboard 部署文件2. 修改yaml配置文件3. 应用安装&#xff0c;查看pod和svc4. 创建dashboard服务账户5. 创建admin-user用户的登录密钥6. 登录6.1 使用token登录(1) 短期token(2) token长期有效 6.2 使用 Kubeconfig 文件登录 7.安装met…

【qiankun乾坤】从0到1搭建微前端

微前端是一种将一个大型单体应用拆分成多个小型应用的架构方式。它可以让不同的团队独立开发部署自己的应用,同时这些应用可以集成到一个统一的底座应用中,对用户来说就是一个完整的应用。 qiankun 是阿里开源的一个微前端实现框架,可以帮助我们比较容易地实现微前端架构。 下…