登录校验过滤器

news2024/11/17 7:56:14

  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 /响应cookie
        return Result.success();
    }

    //获取cookie
    @GetMapping("/c2")
    public Result cookie2(HttpServletRequest request){

        Cookie[] cookies = request.getCookies();//获取所有的cookie
        for (Cookie cookie : cookies) {
            if (cookie.equals("login_username")){      //输出name为login_username 的cookie
                System.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令牌y
    public 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 {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //强转
        HttpServletRequest rep=(HttpServletRequest) servletRequest;
        HttpServletResponse resp=(HttpServletResponse) servletResponse;

        // 1:获取请求url
        String 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 ----->阿里巴巴fastJson
            String 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 ----->阿里巴巴fastJson
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }



        // 6:放行
        log.info("令牌合法 放行");
        filterChain.doFilter(servletRequest,servletResponse);

    }
}

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

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

相关文章

密集书库是什么意思?图书馆密集书库的书可以借出吗

密集书库是一种用于存储大量书籍和资料的高密度储存设施。它通常包括一系列钢制书架和可移动的储存架&#xff0c;使得书籍可以被紧密地排列和存储&#xff0c;以最大程度地利用存储空间。同时&#xff0c;密集书库还有各种自动化系统&#xff0c;如自动化取书系统、气候控制系…

bad_python

攻防世界 (xctf.org.cn) 前戏 下载文件&#xff0c;解压完成后是这个 一个pyc文件 这里要用到python的反编译 要用到的工具有两个 1.python自带的uncompyle6 2.pycdc文件——比uncompyle6强大一点 我们一个一个来尝试一下 uncompyle6&#xff1a; 我是直接在pycharm里面…

骨传导耳机音量大了有害吗?骨传导能保护听力吗?

无论是传统耳机还是骨传导耳机&#xff0c;只要使用音量过大&#xff0c;都会对有一定的损伤&#xff0c;然而由于骨传导耳机的传声原理和佩戴方式比较特殊&#xff0c;所以对人体的损伤比较小&#xff0c;想要知道骨传导耳机能否保护听力&#xff0c;就要先了解骨传导耳机的传…

Day50力扣打卡

打卡记录 三个无重叠子数组的最大和 链接 滑动窗口 class Solution:def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:n, ans len(nums), []sum1 sum2 sum3 0maxsum1idx, maxsum12idx 0, ()maxsum1 maxsum12 total 0for i in range(2 * …

Mybatis-Plus代码生成器怎么用

下载插件 连接数据库 打开代码生成器 生成代码

几何对象的凸点集

// 引入VTK并初始化 #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkActor.h> #include <vtkCamera.h> #include <vtkConvexPointSet.h> #include <vtkDataSetMapper.h&g…

259k+ Star!这是我见过最全的开发者技术学习路线!

大家好&#xff0c;我是 Java陈序员。 自从上班后&#xff0c;身体是一天不如一天了&#xff0c;也很少有时间可以去学习新技术了。程序员如果技术跟不上&#xff0c;很容易就被淘汰。 而碎片化的学习效率又不高&#xff0c;往往今天学了&#xff0c;明天就忘了。有时候更是不…

同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client接收数据

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 发送数据6个字节的数据&#xff1a;0x11,0x22,0x33,0x44,0x55,0x66 在专业版调试软件中编辑指令&#xff0c…

金融帝国实验室(Capitalism Lab)V10版本城市DLC生存模式新改进

金融帝国实验室&#xff08;Capitalism Lab&#xff09;V10版本城市DLC生存模式新改进 ————————————— ★【全新V10版本开发播报】★ 即将发布的V10版本中的城市经济模拟DLC生存模式改进&#xff1a; ◈ 增加了一个新选项&#xff0c;将第一个城市的初始人口设置为…

Android wifi 框架以及Enable流程

Android P相比于Android O的变化 多了WifiStateMachinePrime&#xff08;状态机的前处理机制&#xff09;&#xff0c;wifiService的相关cmd 不再是直接send 给WifiStateMachine&#xff0c;而是被送到WifiStateMachinePrime先进行处理后&#xff0c;再送往WifiStateMachine也…

【带头学C++】----- 九、类和对象 ---- 9.3 析构函数

目录 9.3 析构函数 9.3.1 如何定义析构函数 看下面这个顺序进行释放&#xff0c;{} 代表一个生命周期&#xff0c;或者说作用域。 对象在生命周期结束就会消亡。 9.3 析构函数 9.3.1 如何定义析构函数 函数名和类名称相同&#xff0c;在函数名前加 ~ &#xff0c;没有返回…

uniapp开发小程序经验记录

uniapp开发小程序的过程中会遇到很多问题&#xff0c;这里记录一下相关工具优化&#xff0c;便于后来者参考。 每次保存代码后&#xff0c;小程序都跳回首页 针对这个问题&#xff0c;常规的做法就是修改pages配置文件&#xff0c;但是这种方式不便于路由参数的设置&#xff…

vue3 中使用 sse 最佳实践,封装工具

工具 // 接受参数 export interface SSEChatParams {url: string,// sse 连接onmessage: (event: MessageEvent) > void,// 处理消息的函数onopen: () > void,// 建立连接触发的事件finallyHandler: () > void,// 相当于 try_finally 中的 finally 部分&#xff0c;不…

用户态和内核态

实际上任何Linux发行版(Centos/RedHat....)&#xff0c;其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互。为了避免用户应用导致冲突甚至内核崩溃&#xff0c;用户应用与内核是分离的&#xff1a; 进程的寻址空间会划分为两部分&#xff1a;内核空间、用户空间。…

虾皮数据分析网站:了解Shopee市场趋势与优化运营的利器

在如今的电商时代&#xff0c;越来越多的人选择在虾皮购物&#xff08;Shopee&#xff09;平台上开设自己的店铺。然而&#xff0c;要在这个竞争激烈的市场中脱颖而出并取得成功&#xff0c;并不是一件容易的事情。为了更好地了解市场趋势、优化产品和店铺运营&#xff0c;了解…

百度地图取点 范围绘制 画范围 手工绘制范围

<template><div class"app-container"><div style"margin-bottom:30px"><el-input type"textarea" :rows"2" placeholder"请输入内容" v-model"str"></el-input></div><d…

基于SSM框架的网上书店系统

基于SSM框架的网上书店系统 文章目录 基于SSM框架的网上书店系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 随着互联网的普及和电子商务的快速发展&#xff0c;网上书店系统成为了现代人购买图书的主要方式之一。网上书店系统不仅提供了便捷的…

MFC发送ZPL指令控制斑马打印机

1、参考1&#xff1a;用Python操控斑马打印机的技术总结 - 重拾初心的青年人 - 博客园 (cnblogs.com) 参考2&#xff1a;VC斑马打印机_vc zpl-CSDN博客 参考3&#xff1a;斑马打印机ZPL语言编程实战_梅长酥的博客-CSDN博客 参考4&#xff1a;关于斑马打印机开发的几种方式_斑马…

AGI智能新时代,大模型为软件开发带来范式变革

导语 | 人工智能作为新一轮科技革命和产业变革的重要驱动力量&#xff0c;尤其是在当下新一轮 AI 大模型、生成式 AI 浪潮背景下&#xff0c;重视通用人工智能&#xff08;AGI&#xff09;成为行业的共识。在当前&#xff0c; AGI 技术背后的逻辑究竟是怎样的&#xff1f;技术创…

【shell】

shell 一、shell简介二、shell脚本的执行方式三、shell变量3.1 shell变量介绍3.2 shell变量的定义3.1.1 基本语法3.2.2 定义变量的规则3.2.3 将命令的返回值赋予变量 四、环境变量的设置4.1 基本语法&#xff1a; 五、位置参数变量5.1 基本介绍5.2 基本语法 六、预定义变量6.1 …