登录校验过滤器

  1. 会话技术
  2. JWT令牌
  3. 过滤器Filter
  4. 拦截器 interceptor

cookise

package com.it.controller;import com.it.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Slf4j
@RestController
public class SessionController {//设置cookie@GetMapping("/c1")public Result cookie1(HttpServletResponse response){response.addCookie(new Cookie("login_username","it"));  //设置cookie /响应cookiereturn Result.success();}//获取cookie@GetMapping("/c2")public Result cookie2(HttpServletRequest request){Cookie[] cookies = request.getCookies();//获取所有的cookiefor (Cookie cookie : cookies) {if (cookie.equals("login_username")){      //输出name为login_username 的cookieSystem.out.println("login_username:"+cookie.getValue());}}return Result.success();}}

session

    //往httpSession中存储值@GetMapping("/s1")public Result sessio1(HttpSession session){log.info("HttpSession-s1 :{}",session.hashCode());session.setAttribute("loginUser","mamat");return  Result.success();}// 往HttpSession 中的取值@GetMapping("/s2")public Result session2(HttpServletRequest request){HttpSession session =request.getSession();log.info("HttpSession-s2:{}",session);Object loginUser=   session.getAttribute("loginUser") ;    //从session获取数据log.info("loginUser:{}",loginUser);return Result.success(loginUser);}

 jwt令牌 引入依赖

 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

package com.it.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;
import java.util.Map;public class JwtUtils {public static String signKey ="itWord";  //密钥public static Long expire = 43200000L;  //密钥   一分钟等于1000 毫秒     (43200000L 12小时)//生成JWT令牌ypublic static String generateJwt(Map<String,Object> claims){String jwt= Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256,signKey).setExpiration(new Date(System.currentTimeMillis()+expire)).compact();return jwt;}//解析JWT令牌public static Claims parseJWT(String jwt){Claims claims =Jwts.parser().setSigningKey(signKey).parseClaimsJwt(jwt).getBody();return  claims;}
}

JWT令牌生成调用

@PostMapping("/login")public Result login(@RequestBody Emp emp){log.info("员工登录,:{}",emp);Emp emp1 =empservice.login(emp);// 登录成功 生成令牌 下发令牌if (emp1!=null){Map<String, Object> claims =new HashMap<>();claims.put("id",emp1.getId());claims.put("name",emp1.getName());claims.put("username",emp1.getUsername());  // jwt令牌包含当前登录的员工信息String jwt = JwtUtils.generateJwt(claims);return Result.success(jwt);}return Result.error("用户名或者密码错误");}

过滤器拦截调用

package com.it.filter;import com.alibaba.fastjson.JSONObject;import com.it.pojo.Result;
import com.it.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;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 rep=(HttpServletRequest) servletRequest;HttpServletResponse resp=(HttpServletResponse) servletResponse;// 1:获取请求urlString url = rep.getRequestURI().toString();log.info("请求路径:{}",url);// 2:判断请求URl中是否包含login, 如果包含说明登录操作 可以放行if (url.contains("login")){log.info("登录操作 ,放行");filterChain.doFilter(servletRequest,servletResponse);return;}// 3: 获取请求头中的令牌(token)String jwt = rep.getHeader("token");log.info("Jwt,令牌数据:{}",jwt);// 4: 判断令牌是否存在 ,如果不存在,返回错误结果 (未登录)if (!StringUtils.hasLength(jwt)){log.info("请求头token为空 返回未登录信息");Result error  = Result.error("NOT_LOGIN");// 手动转换对象-- json ----->阿里巴巴fastJsonString notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}// 5:解析token, 如果解析失败 。返回错误结果(未登录)try {JwtUtils.parseJWT(jwt);} catch (Exception e) {   //jwt 解析失败e.printStackTrace();log.info("解析令牌解析失败 返回未登录错误信息");Result error  = Result.error("NOT_LOGIN");// 手动转换对象-- json ----->阿里巴巴fastJsonString notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}// 6:放行log.info("令牌合法 放行");filterChain.doFilter(servletRequest,servletResponse);}
}

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

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

相关文章

Android wifi连接和获取IP分析

wifi 连接&获取IP 流程图 代码流程分析 一、关联阶段 1. WifiSettings.submit – > WifiManager WifiSettings 干的事情比较简单&#xff0c;当在dialog完成ssid 以及密码填充后&#xff0c;直接call WifiManager save 即可WifiManager 收到Save 之后&#xff0c;就开…

新的 BLUFFS 攻击导致蓝牙连接不再私密

蓝牙是一种连接我们设备的低功耗无线技术&#xff0c;有一个新的漏洞需要解决。 中间的攻击者可以使用新的 BLUFFS 攻击轻松窥探您的通信。 法国研究中心 EURECOM 的研究员 Daniele Antonioli 演示了六种新颖的攻击&#xff0c;这些攻击被定义为 BLUFFS&#xff08;蓝牙转发和…

【Java】文件I/O-文件内容操作-输入输出流-Reader/Writer/InputStream/OutputStream四种流

导读 在文件I/O这一节的知识里&#xff0c;对文件的操作主要分为两大类&#xff1a; ☑️针对文件系统进行的操作 ☑️针对文件内容进行的操作 上文已经讲了针对文件系统即File类的操作&#xff0c;这篇文章里博主就来带了解针对文件内容的操作&#xff0c;即输入输出流&am…

04_网络编程

网络编程 什么是网络编程 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09; java.net.* 包下提供了网络编程的解决方案 通信的基本架构 CS 架构&#xff08;Client 客户端 / Server 服务端&#xff09;BS 架构&#xff08;…

Open Inventor 2023.2.1 Crack

Fixed Bugs List 2023.2 2023.2.1 Open Inventor 2023.2.1 MeshViz #OIV-4824 Crash in MeshViz PbNonLinearDataMapping::computeColor Cache #OIV-4867 SoText3 : Texture read access violation – CAS-44904 Core #OIV-4725 Invalid displayed PoCircle color…

MySQL笔记-第06章_多表查询

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第06章_多表查询1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. …

C#网络编程UDP程序设计(UdpClient类)

目录 一、UdpClient类 二、示例 1.源码 &#xff08;1&#xff09;Client &#xff08;2&#xff09;Server 2.生成 &#xff08;1&#xff09;先启动服务器&#xff0c;发送广播信息 &#xff08;2&#xff09;再开启客户端接听 UDP是user datagram protocol的简称&a…

基于Python的PyGame的俄罗斯方块游戏设计与实现

摘 要 近年来&#xff0c;随着游戏产业的突飞猛进&#xff0c;游戏玩家的技术也是与日俱增&#xff0c;当你看见游戏高手完美的表演时&#xff0c;你是否想过我也能达到那种水平&#xff0c;本程序用Python语言编写俄罗斯方块&#xff0c;左侧显示正在运行的游戏&#xff0c;右…

BFS求树的宽度——结合数组建树思想算距离

二叉树最大宽度 https://leetcode.cn/problems/maximum-width-of-binary-tree/description/ 1、考虑树的宽度一定是在一层上的所以进行BFS&#xff0c;树的BFS不建议直接使用队列&#xff0c;每次add/offer然后poll/remove&#xff0c;这样子层级关系不好显示。我们可以定义…

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

Apache Sqoop使用

1. Sqoop介绍 Apache Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。 Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。 Hadoop 生态系统包括&#xff1a;HDFS、Hi…

Ubuntu20.04安装向日葵、开机自启、解决windows系统远程黑屏(笔记)

这里写目录标题 动机1. Ubuntu20.04 安装向日葵2. 设置开机自启3. 解决windows不可远程的问题4. 大公告成 动机 办公室有个工作站&#xff0c;要比我的笔记本的CPU稍微好一点&#xff0c;用来跑陆面过程。我信心满满的装了个Ubuntu20.04双系统,但是发现向日葵安装不上了。我少…

从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

题目描述&#xff1a;从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 bool DeleteMin(SqList &L,int &min){if(L.length 0)return false;min L…

回溯和分支算法

状态空间图 “图”——状态空间图 例子&#xff1a;农夫过河问题——“图”状态操作例子&#xff1a;n后问题、0-1背包问题、货郎问题(TSP) 用向量表示解&#xff0c;“图”由解向量扩张得到的解空间树。 ——三种图&#xff1a;n叉树、子集树、排序树 ​ 剪枝 不满住条件的…

时间序列数据压缩算法简述

本文简单介绍了时间序列压缩任务的来源&#xff0c;压缩算法的分类&#xff0c;并对常见压缩算法的优缺点进行了简介&#xff0c;爱码士们快来一探究竟呀&#xff01; 引言 时间序列数据是在许多应用程序和领域中生成的一种基本数据类型&#xff0c;例如金融、医疗保健、交通和…

基于Python手把手教你实现flappy bird游戏

目录 前言开始前的准备工作进入正题结束语 前言 想必玩过游戏的都知道&#xff0c;Flappy Bird是一款简单却富有挑战性的经典的小鸟飞行游戏&#xff0c;让许多玩家为之痴迷&#xff0c;而作为开发者&#xff0c;那肯定要通过技术手段来再做一遍这款经典游戏。那么本文就来通…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…

SQL基础理论篇(十):事务处理

文章目录 简介事务的四大特性ACID如何使用事务参考文献 简介 MySQL在5.5版本之前&#xff0c;默认的存储引擎是MyISAM&#xff0c;它是不支持事务的&#xff0c;而5.5版本之后默认的引擎是InnoDB&#xff0c;这个是支持事务的&#xff0c;这也是InnoDB最终取代MyISAM称为主流引…

vscode配置使用 cpplint

标题安装clang-format和cpplint sudo apt-get install clang-format sudo pip3 install cpplint标题以下settings.json文件放置xxx/Code/User目录 settings.json {"sync.forceDownload": false,"workbench.sideBar.location": "right","…

振动和震动的区别?

问题描述&#xff1a;振动和震动的区别&#xff1f; 问题解决&#xff1a; 震动&#xff08;Oscillation&#xff09;&#xff1a; 特点&#xff1a; 随机的、突发的、不经常的、无规律的运动。例子&#xff1a; 地壳震动、消息震动全国&#xff0c;强调的是运动的力度或幅度&…