过滤器和拦截器的基本知识

2024-06-16 07:20

本文主要是介绍过滤器和拦截器的基本知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

过滤器和拦截器的基本知识

前提提要,由于过滤器和拦截器的相关函数是没有返回值的,所以我们像前端返回数据时需要使用到HttpServletResponse中的相关函数,且需要配合阿里巴巴的插件fastjson将返回信息转为json格式,或者使用gson转为json

  • fastjson使用示例
HttpServletResponse response = (HttpServletResponse) servletResponse;
Result result = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(result);
response.getWriter().write(notLogin);
  • gson使用实例:
private GSon gson;
@Test
public void testJSON()
{String json = gson.toJson(Result.success());System.out.println(json);
}

一、过滤器

过滤器是javaWeb的三大组件之一,所以我们在使用过滤器是需要在启动类添加注解@ServletComponentScan, 表明该springboot工程支持Servlet组件扫描

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;import javax.servlet.annotation.WebFilter;
// 表明支持Servlet组件扫描
@ServletComponentScan
@SpringBootApplication
public class TiliasWebManagementApplication {public static void main(String[] args) {SpringApplication.run(TiliasWebManagementApplication.class, args);}}

使用过滤器我们一般需要实现三个函数,分别是

  • init —>这个函数提供了默认实现,可以不实现
  • doFilter -->核心函数
  • destory -->同样提供了默认实现,可以不实现

在这里插入图片描述

1、执行流程

在这里插入图片描述

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {// filterChain.doFilter之前的操作为放行前的操作,像身份验证这些需要判断的一般都是filterChain.doFilter执行前完成的//放行,即如果前面的过滤条件满足,则将请求发送给对应的执行函数进行后续操作filterChain.doFilter(servletRequest, servletResponse);// filterChain.doFilter之后的操作为放行后的操作}

下面是一个登录验证的操作

    @Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 获取URLString url = request.getRequestURI().toString();if (url.contains("login")) {filterChain.doFilter(servletRequest, servletResponse);return;}// 获取tokenString jwt = request.getHeader("token");log.info("token = {}", jwt);// 如果token为空,但会未登录信号if (!StringUtils.hasLength(jwt)) {Result result = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(result);response.getWriter().write(notLogin);return;}try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("jwt令牌无效");Result result = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(result);response.getWriter().write(notLogin);return;}//放行filterChain.doFilter(servletRequest, servletResponse);}

二、拦截器

拦截器的使用一般还需要配合一个配置类的使用,所以拦截器实现相较于过滤器略显复杂,但也相差无几

在这里插入图片描述

拦截器的使用一般需要添加一个配置类,该配置类需要实现WebMvcConfigurer中的addInterceptors方法

package com.example.config;import com.example.interceptor.LoginCheckInterceptor;
import lombok.extern.slf4j.Slf4j;
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 设置该类为一个配置类
@Slf4j
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册一个拦截器,拦截除了/login之外的所有请求registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}}

拦截器同样有三个重要函数,实现效果跟Filter类似

  • preHandle -->放行前的操作
  • postHandle -->放行后的操作
  • afterCompletion–>最后执行的操作

其中,拦截器更精细化的控制前端的请求

在这里插入图片描述

  • 使用示例
package com.example.interceptor;import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 拦截器处理逻辑*/
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override// 目标资源方法前执行,true为方行,false为拦截// 与doFilter的fileChain前执行的方法类似public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取tokenString token = request.getHeader("token");// 如果token为空,返回未登录信号if(!StringUtils.hasLength(token)){Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);return false;}// 放行return true;}@Override// 目标资源方法后执行后执行// 与doFilter的fileChain后执行的方法类似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");}
}

需要注意的是,拦截器的放行和拦截是使用true和false来指定的,true表明放行,false表明拦截

这篇关于过滤器和拦截器的基本知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065808

相关文章

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

Linux命令与基本知识

一、基本知识 1、Linux内多有的数据都是以文件的形态呈现的。Linux系统中最重要的在于目录树结构。整个目录树结构最重要的是根目录,其表示方法为“/”。 2、挂载(mount):即将目录树结构的架构与磁盘内的数据结合起来。挂载利用一个目录作为进入点,将磁盘分区的数据放置在该目录下,也就是说,进入该目录就可以读取该分区。 树状目录结构 /bin:bin是Binary的缩写, 这个

Java web项目注册过滤器的两种方式

这篇文章分享一下Java web项目中注册过滤器的两种方式,经常用的是第二种,第一种应该很少人用过吧~   第一步:创建管理器 import javax.servlet.*;import java.io.IOException;/*** @author heyunlin* @version 1.0*/public class GlobalFilter implements Filt

react实现路由拦截器

1. 路由拦截的概念 路由拦截:在用户导航到某个路由之前,通过某种逻辑来拦截、检查或修改导航行为。它可以用于实现权限控制、身份验证、页面加载前的准备工作等场景。 2. React Router中的路由拦截实现 2.1 使用<Route>组件的render属性 在React Router中,我们可以使用<Route>组件的render属性来定义拦截逻辑。render属性接收一个函数,这个函数

拦截器Interceptor

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截方法的执行。 作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

java中的拦截器与过滤器

1 过滤器 主要是应用于servlet,现在都说拦截器。 也就是说servlet的过滤器与SpringMVC拦截器之间的关系与区别 2 你的每一个请求都会先进你写的拦截器在进入你写的方法,不破坏你的业务逻辑  在你的业务之外做一些其他事情 3 在xml中配置的目的是为了找到这个文件(类),这个文件(类)的内容很正常 就是写方法实现自己的业务 198 拦截器:1 还可以用来转码 过

springmvc验证登录用过滤器还是拦截器

https://zhidao.baidu.com/question/650826885570689365.html?qbl=relate_question_0&word=%B9%FD%C2%CB%C6%F7%B5%C7%C2%BD%D1%E9%D6%A4%D3%EB%C0%B9%BD%D8%C6%F7%B5%C7%C2%BD%D1%E9%D6%A4 在struts2中用过filt

vue在script中使用过滤器

在 Vue.js 中,过滤器(filters)主要是用于在模板中格式化文本,它们并不是为了在 <script> 部分或 Vue 组件的 JavaScript 逻辑中使用的。但是,如果你希望在 Vue 组件的 <script> 部分执行类似过滤器的功能,你可以使用方法来达到这个目的。 以下是一个示例,展示如何在 Vue 组件的 <script> 部分创建一个方法,这个方法可以模拟过滤器的功能:

Elasticsearch过滤器(Filter):原理及使用

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。 目录 Elasticsearch过滤器(Filter):原理及使用过滤器的原理过滤器的使用总结 Elasti

SpringMVC无xml文件之静态资源,拦截器配置和@EnableWebMvc

文章目录 1 SpringMVC配置1.1 原项目参考1.2 静态资源映射1.3 拦截器配置1.4 其他配置1.5 @EnableWebMvc1.5.1 对spring boot项目影响1.5.2 @EnableWebMvc、WebMvcConfigurationSupport、WebMvcConfigurationAdapter 1 SpringMVC配置 1.1 原项目参