过滤器Filter和拦截器Interceptor实现登录校验

一.过滤器

  • Filter过滤器可以把对资源的请求拦截下来,从而实现一些登录验证的功能

1.Filter的快速入门

  • 1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。
  • 2.配置
public class dofilter implements Filter {
    @Override //初始化只执行一次
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
    @Override  //拦截操作
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截操作执行");
        //放行前逻辑
        System.out.println("放行前逻辑");
        // 放行 到达下一个filter(如果有)或者执行资源方法
        filterChain.doFilter(servletRequest,servletResponse);
        //获取资源后返回
        System.out.println("获取资源后返回");
    }
    @Override
    public void destroy() {//销毁只执行一次
        Filter.super.destroy();
    }
}

Filter类上加@WebFilter注解,配置拦截资源的路径。

3fbc488fe35b49b9b20be64056d9c209.png

启动类上加@ServletComponentScan开启Servlet组件支持。

74c604eea3964035837966f43ba6bbf7.png

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

4047693a7f0946deb8b85e58b0a67e37.png

过滤器链

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

优先级是按照过滤器名字首字母顺序

2.JWT和过滤器Filter实现登录校验

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

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.util.StringUtil;
import it.com.springbootmybatisprimary.pojo.Result;
import it.com.springbootmybatisprimary.utils.AliOSSUtils;
import it.com.springbootmybatisprimary.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import netscape.javascript.JSObject;
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("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截到请求");
        
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String url=request.getRequestURI().toString();//获取请求url
        log.info("url {}",url);
        if(url.contains("login")){//1.url包含login的话放行
            //包含login执行放行操作并return
            log.info("放行");
            filterChain.doFilter(servletRequest,servletResponse);
            return;//获取web资源后直接返回
        }
        //2.获取jwt
        String jwt = request.getHeader("token");
        //3.检查jst令牌不为空
        if(!StringUtils.hasLength(jwt)){//返回错误信息
            Result error = Result.error("NO_LOGIN");
            log.info("jwt令牌不存在");
            //转化为json格式数据 利用fastjson
           String s= JSONObject.toJSONString(error);
             response.getWriter().write(s);
             return;
        }
        //4.检查jwt令牌合法
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析失败 返回报错");
            Result error = Result.error("NO_LOGIN");
            //转化为json格式数据
            String s= JSONObject.toJSONString(error);
            response.getWriter().write(s);
            return;
        }
        //5.放行
        log.info("合法 放行");
        filterChain.doFilter(request,response);
    }
}

Postman测试

1.含有login请求

30f3c7f2e3354beaa8fe2aebc473bc9f.png

2.不含login请求

1593ee30c8d64e58b82bbc03ac42d940.png

9990e00548224d4ea992013e8f4b1146.png

3.请求头包含jwt测试

首先获取JWT令牌

然后emps请求携带JWT令牌测试

e76aad0e4f9e4f2085ed0a5d1c0d7fe6.png

控制台

0772a58385a94d3f8833ab80728f5b50.png

输入错误JWT 校验失败返回报错

87ba63bb1eed498280a72bc80b06e9f2.png

c135beb265dd4eb8bddad401b4700766.png

二.拦截器

什么是拦截器?

是一种动态拦截方法调用的机制,类似于过滤器。
拦截器的作用:

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

1.拦截器Interceptor入门

1.定义类实现HandleInterceptor接口

5b418176b6944bb89766fbb6c4bda0c0.png

2.定义配置类实现WebMvcConfigurer

0d760dc98b54462d98037458f40f2a77.png

3.postman测试

1.放行的情况

prehandle返回true 表示放行,执行资源方法完毕后,执行posthandle和aftercompletion

cd1e7c17eaac477cb500bc4e4c1113e1.png

e0550411a46145118b5d936317533880.png

2.不放行的情况

prehandle返回false表示不放行一直被拦截

edfb84d92a474be290d8f6e335aeb159.png

d80fd9d9225241bb8fdacffd5fc422b5.png

2.拦截路径

在拦截器中除了可以设置/**拦截所有资源外,还有一些常见拦截路径设置:

拦截路径

含义

举例

/*

一级路径

能匹配/depts,/emps,/login,不能匹配 /depts/1

/**

任意级路径

能匹配/depts,/depts/1,/depts/1/2

/depts/*

/depts下的一级路径

能匹配/depts/1,不能匹配/depts/1/2,/depts

/depts/**

/depts下的任意级路径

能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1

 

  • 在controller当中的方法执行完毕之后,再回过来执行

postHandle()这个方法以及afterCompletion() 方法,然后再返回给DispatcherServlet,最终再来执行过滤器当中放行后的这一部分逻辑的逻辑。执行完毕之后,最终给浏览器响应数据。

3.拦截器与过滤器执行时机

  • 当我们打开浏览器来访问部署在web服务器当中的web应用时,此时我们所定义的过滤器会拦截到这次请求。拦截到这次请求之后,它会先执行放行前的逻辑,然后再执行放行操作。而由于我们当前是基于springboot开发的,所以放行之后是进入到了spring的环境当中,也就是要来访问我们所定义的controller当中的接口方法。
  • Tomcat并不识别所编写的Controller程序,但是它识别Servlet程序,所以在Spring的Web环境中提供了一个非常核心的Servlet:DispatcherServlet(前端控制器),所有请求都会先进行到DispatcherServlet,再将请求转给Controller。
  • 当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行

e30070a0ebd54260a2eb9fefdf3a36b0.png

拦截器与过滤器的区别:

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。

postman测试控制台输出日志

c7579243a4984ba9b58f14917f9715f5.png

2.拦截器InterCeptor实现登录校验功能

在放行前进行登录校验所以在prehandle函数进行

与过滤器实现登录校验逻辑一致,直接复制修改一下

放行操作改为return true 不放行操作改为return false

类型就是Http类型不用强转

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行preHandle");//访问资源前执行 return true表示放行 false表示拦截
      /*  System.out.println("filter拦截到请求");*/

        //强转 能够调HttpServletRequest和HttpServletResponse接口中特有的方法和属性,这些方法和属性在更通用的
        //ServletRequest和ServletResponse接口中并不存在。例如要获取请求的URL/getRequestURI())、查询参数(
        //getParameter())、请求头(getHeader())等
        String url = request.getRequestURI().toString();//获取请求url
        log.info("url {}", url);
        if (url.contains("login")) {//1.url包含login的话放行
            //包含login执行放行操作并return
         /*   log.info("filter放行");*/
           return true;
           /* System.out.println("filter放行后");*/

        }
        //2.获取请求jwt
        String jwt = request.getHeader("token");//获取token携带的jwt
        //3.检查jst令牌不为空
        if (!StringUtils.hasLength(jwt)) {//返回错误信息
            Result error = Result.error("NO_LOGIN");
            log.info("jwt令牌不存在");
            //转化为json格式数据 利用fastjson
            String s = JSONObject.toJSONString(error);
            response.getWriter().write(s);
            return true;
        }
        //4.检查jwt令牌合法
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析失败 返回报错");
            Result error = Result.error("NO_LOGIN");
            //转化为json格式数据
            String s = JSONObject.toJSONString(error);
            response.getWriter().write(s);//写入响应体(getWriter().write())
            return false;
        }
        //5.放行
        log.info("合法 放行");
        /*filterChain.doFilter(request, response);//继续过滤器链*/
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行postHandle");//资源方法执行后执行
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行afterCompletion");//视图渲染后执行
    }
}

postman测试

58ec3c64953a430195bde99fa35e16e0.png

aa078093c4be4b69b85e89945d14c469.png

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇聚荣电商:拼多多开店需要多少费用?

想要在拼多多这个巨大的电商平台上开一家属于自己的店铺,很多创业者都会关心一个问题:开店需要多少费用?答案并不复杂,但背后的经营哲学和策略却值得深究。接下来,让我们从四个不同的方面来详细探讨这个问题。 一、开店成本分析 …

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

汇昌联信电商:拼多多网店好做吗?

在电子商务的海洋中,拼多多以其独特的团购模式和亲民策略迅速崛起,吸引了大批消费者和商家的目光。对于“拼多多网店好做吗?”这个问题,答案并非简单的是与否,而是需要从多个维度进行深入分析。 一、市场定位与竞争环境 拼多多定…

基于STM32F401RET6智能锁项目(BS82166A_3触摸按键)

一、BS81x 特征 • 工作电压:2.2V~5.5V • 低待机电流 • 自动校准功能 • 可靠的触摸按键检测 • 自动切换待机 / 工作模式 • 最长按键输出时间检测 • 具备抗电压波动功能 • Level Hold,可选高有效或低有效 • NMOS 输出内建上拉电阻 /CMOS 直接 输出…

PDF文件恢复:四种实用方法全解析

如何恢复已删除的PDF文件? PDF是Portable Document Format(便携式文档格式)的缩写,是一种由Adobe Systems开发的文件格式。PDF文件可以包含文本、图形、链接、多媒体以及其他各种元素,并且能够在各种操作系统和设备上…

[uniapp] 配置ts类型声明

我想引进图片,但是报错 声明一下就行 TypeScript 支持 | uni-app官网 创建tsconfig.json文件,复制官网的配置 然后在随便一个目录下写一个随便名字的.d.ts文件 例如这样 保存就行 因为ts是默认扫描全部的,所以要按照官网的写法 把不必要的排除掉就行,免得浪费性能

力扣HOT100 - 279. 完全平方数

解题思路&#xff1a; 动态规划 class Solution {public int numSquares(int n) {int[] dp new int[n 1];// 初始化dp数组&#xff0c;默认最坏情况是每个数都是由1相加得到的for (int i 1; i < n; i) {dp[i] i;}for (int i 1; i < n; i) {for (int j 1; j * j &…

H5嵌入原生----兼容安卓与ios

主要分UI展示&#xff0c;键盘&#xff0c;输入框等等。解决bug最苦恼的问题不是没有解决方案&#xff0c;而是你没有找到真正的原因。再就是现象难以重现&#xff0c;每次都要发布代码&#xff0c;然后到手机app中去测试&#xff0c;模拟。这些地方会耗费大量的精力。 一、UI…

C++ C# 贝塞尔曲线

二阶贝塞尔曲线公式 三阶贝塞尔曲线公式 C 三维坐标点 二阶到N阶源码 //二阶公式&#xff1a; FVector BezierUtils::CalculateBezierPoint(float t, FVector startPoint, FVector controlPoint, FVector endPoint) {float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);…

MQ消息积压,把我整吐血了

我之前在一家餐饮公司待过两年&#xff0c;每天中午和晚上用餐高峰期&#xff0c;系统的并发量不容小觑。为了保险起见&#xff0c;公司规定各部门都要在吃饭的时间轮流值班&#xff0c;防止出现线上问题时能够及时处理。 我当时在后厨显示系统团队&#xff0c;该系统属于订单…

图像归一化处理

归一化 归一化是一种简化计算的方式&#xff0c;即将有量纲的表达式&#xff0c;经过变换&#xff0c;化为无量纲的表达式&#xff0c;成为标量。 在多种计算中都经常用到这种方法。 简单介绍 归一化是一种无量纲处理手段&#xff0c;使物理系统数值的绝对值变成某种相对值关…

一台linux通过另一台linux访问互联网-TinyProxy

参考&#xff1a; https://blog.csdn.net/weixin_41831919/article/details/113061317https://www.yuncongz.com/archives/1.htmlhttps://blog.csdn.net/aoc68397/article/details/101893369 环境&#xff1a;ubuntu 18.04 机器1: IP 219.216.65.252 (可以访问外网) 机器2: IP…

文本换列新手教程:一键两列对换操作,提升文本编辑效率的实用技巧

在文本编辑过程中&#xff0c;有时我们需要对文本进行列与列之间的对换操作&#xff0c;以满足特定的排版需求或信息呈现方式。这种操作虽然看似简单&#xff0c;但对于新手来说&#xff0c;可能会因为不熟悉相关技巧而感到困惑。今天&#xff0c;我们将为大家介绍一种简单而高…

研究生学习---找工作

规划 研一~研二上学期完成小论文&#xff0c;实习&#xff0c;秋招 竞赛&#xff1a;kaggle&#xff1f; 面试题一般简单且为原题&#xff0c;笔试题目很难&#xff0c;不会出原题 项目 找工作软件

微软必应bing国内官方代理商,广告账户如何开户?

微软必应Bing作为全球知名的搜索引擎之一&#xff0c;其广告平台为众多企业提供了广阔的市场空间和精准的推广机会。对于中国内地的企业而言&#xff0c;通过必应Bing开展国内广告推广不仅能够触及更广泛的潜在客户群体&#xff0c;还能有效提升品牌影响力。通过微软必应Bing国…

大数据可视化实验(五):Tableau数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;打开数据源... 1 2&#xff09;进入工作簿... 2 3&#xff09;字段设置... 2 4&#xff09;数据筛选... 3 5&#xff09;绘制条形图... 3 四、思考问题... 4 五、总结与心得体会... 4 一、…

面对.halo勒索病毒,如何有效防范与应对?

导言&#xff1a; 随着网络技术的不断发展&#xff0c;网络安全问题也日益凸显。其中&#xff0c;勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;近年来在全球范围内频发。其中&#xff0c;.halo勒索病毒作为勒索病毒家族中的一员&#xff0c;其危害性和传播性不容忽视…

Intel HDSLB 高性能四层负载均衡器 — 快速入门和应用场景

目录 文章目录 目录前言与背景传统 LB 技术的局限性HDSLB 的特点和优势HDSLB 的性能参数基准性能数据对标竞品 HDSLB 的应用场景HDSLB 的发展前景参考文档 前言与背景 在云计算、SDN、NFV 高速发展并普遍落地的今天&#xff0c;随着上云业务的用户数量越来越多、数据中心的规模…

pve clusterk8s cluster重建

背景 dev环境新买了一块固态&#xff0c;插到pve主板的第二个M.2槽位不能识别&#xff0c;通过其他机器排查后确定是这台pve的槽位问题。 同时这台pve还有一些其他的lvm历史遗留问题&#xff0c;具体表现是每次开机很长&#xff0c;因为要扫描那块机械硬盘做的lvm 所以决定将这…

ubuntu编译pcl时报错

报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…