拦截器:和过滤器用途基本类似

SpringBoot2.X新版本配置拦截器 implements WebMvcConfigure

  • 自定义拦截器 HandlerInterceptor

    • preHandle:调用Controller某个方法之前
    • postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
    • afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
  • 按照注册顺序进行拦截,先注册,先被拦截

拦截不生效常见问题

  1. 是否有加@Configuration
  2. 拦截路径是否有问题 **和*
  3. 拦截器最后路径一定要 /** 如果是目录的话则是 /*/

场景:权限控制、用户登陆状态控制等

和Filter过滤器的区别

Filter和Interceptor二者都是AOP编程思想的体现,功能基本都可以实现
拦截器功能更强大些,Filter能做的事情它都能做
Filter在只在Servlet前后起作用,而Interceptor能够深入到方法前后、异常抛出前后等
依赖于Servlet容器既web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境
在接口调用的生命周期,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
Filter和Interceptor的执行顺序
过滤前->拦截前->action执行->拦截后->过滤后

CustomWebMvcConfigure.java

package net.cyb.demo.interceptor;

import org.springframework.context.annotation.Bean;
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 CustomWebMvcConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/api/v1/pri/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
@Bean
public LoginIntercepter getLoginInterceptor(){
return new LoginIntercepter();
}
}

LoginIntercepter.java

package net.cyb.demo.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import net.cyb.demo.domain.User;
import net.cyb.demo.service.impl.UserServiceImpl;
import net.cyb.demo.utils.JsonData;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.thymeleaf.util.StringUtils; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter; public class LoginIntercepter implements HandlerInterceptor {
private static final ObjectMapper objectMapper=new ObjectMapper();
private void renderJson(HttpServletResponse response,String json){
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
try{
PrintWriter writer=response.getWriter();
writer.print(json);
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
System.out.println("LoginIntercepter preHandle==========");
String token = req.getHeader("token");
if (StringUtils.isEmpty(token)) {
token = req.getParameter("token");
}
if (StringUtils.isEmpty(token)) {
JsonData jsonData=JsonData.buildError(-3,"未登陆");
String jsonStr=objectMapper.writeValueAsString(jsonData);
renderJson(resp, jsonStr);
return false;
} else {
//判断token是否合法 TODO
User user = UserServiceImpl.sessionMap.get(token);
if (user != null) {
return true;
}else {
JsonData jsonData=JsonData.buildError(-2,"登陆失败,token无效");
String jsonStr=objectMapper.writeValueAsString(jsonData);
renderJson(resp, jsonStr);
return false;
}
}
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LoginIntercepter postHandle==========");
HandlerInterceptor.super.postHandle(request,response,handler,modelAndView);
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("LoginIntercepter afterCompletion==========");
HandlerInterceptor.super.afterCompletion(request,response,handler,ex);
}
}

SpringBoot2.X新版本配置拦截器在项目中的使用的更多相关文章

  1. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-10.Springboot2.x用户登录拦截器开发实战

    笔记 10.Springboot2.x用户登录拦截器开发实战     简介:实战开发用户登录拦截器拦截器 LoginInterceptor                  1.实现接口 LoginI ...

  2. Spring Boot配置拦截器及实现跨域访问

    拦截器功能强大,能够深入方法前后,常应用于日志记录.权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现Spring Boot自定义拦截器的配置. 理论指导 问:Spring Boot怎么 ...

  3. SpringBoot——配置类实现WebMvcConfigurer接口来配置拦截器、view-controller、视图解析器等

    目的:为了保留SpringBoot对SpringMVC自动配置,另外我们还想要做一些自己拓展的功能 如何做扩展? 以配置view-controller实现跳转为例: 原先在SpringMvc中我们写v ...

  4. spring原拦截器配置与新命名空间mvc:interceptors配置拦截器对照与注意事项

    原先,我们是这么配置拦截器的 <bean id="openSessionInViewInterceptor"class="org.springframework.o ...

  5. SpringBoot配置拦截器

    [配置步骤] 1.为类添加注解@Configuration,配置拦截器 2.继承WebMvcConfigurerAdapter类 3.重写addInterceptors方法,添加需要拦截的请求 @Co ...

  6. SpringMvc配置拦截器

    SpringMVC可以通过配置拦截器,进行url过滤等处理. 在spring-mvc.xml的配置文件中,如下示: 其中,在<mvc:interceptors>中可以配置多个拦截器< ...

  7. springboot 配置拦截器

    1 有这样一个需求 服务端对部分请求URL需要验证身份.如果验证错误,停止请求,按照既定的数据格式返回:如果验证正确,继续执行请求. 2 需要这样做 1. 将指定格式的请求拦截下来: 2. 获取参数, ...

  8. Struts_登录练习(配置拦截器)

    需求:类似过滤器看有没有登录,没登陆就返回登陆界面,在上文基础上实现 1.新建拦截器 2.配置拦截器 3.完成.

  9. Spring实现自定义注解并且配置拦截器进行拦截

    有时候我们会自定义注解,并且需要配置拦截器对请求方法含有该自定义注解的方法进行拦截操作 自定义注解类 NeedToken.java import java.lang.annotation.Docume ...

  10. springmvc 配置拦截器

    package com.aaa.zxf.interceptor; import org.springframework.boot.autoconfigure.SpringBootApplication ...

随机推荐

  1. 鸿蒙HarmonyOS实战-Stage模型(ExtensionAbility组件)

    一.ExtensionAbility组件 1.概念 HarmonyOS中的ExtensionAbility组件是一种能够扩展系统功能的能力组件.它可以通过扩展系统能力接口,为应用程序提供一些特定的功能 ...

  2. Java面试题:Spring中的循环依赖,给程序员带来的心理阴影

    循环依赖通常发生在两个或多个Spring Bean之间,它们通过构造器.字段(使用@Autowired)或setter方法相互依赖,从而形成一个闭环.下面是一个使用字段注入(即使用@Autowired ...

  3. VisualStduio如何自定义代码片段

    什么是代码片段 代码片段又叫CodeSnippet,可以用来快捷补全代码.其实我们经常使用这个功能. 比如for循环,输入for会弹出这个窗口 我们选择第二个for,再按两次Tab键,编辑器就会自动生 ...

  4. VAE-可变自动编码器

    VAE 有什么作用? 简而言之,它改进了生成的图像.VAE 针对图像的某些方面进行训练,并且我们的 UI ( vae-ft-mse-840000-ema-pruned) 中捆绑的默认 VAE 改善了生 ...

  5. 深入理解Docker原理

    本文参考转载至:<深入剖析Kubernetes - 张磊> 更过优秀博文请关注:https://blog.bigcoder.cn 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而 ...

  6. 互联网软件的安装包界面设计-Inno setup

    https://blog.csdn.net/oceanlucy/article/details/50033773 "安装界面太丑了,不堪入目!" "这界面应该属于20年代 ...

  7. Particles.js:为Web项目增添动态粒子效果

    Particles.js:为Web项目增添动态粒子效果 示例 介绍 Particles.js是一个轻量级的JavaScript库,用于在Web页面上创建和管理动态粒子效果.它允许开发者通过简单的配置文 ...

  8. 【论文笔记】R-CNN系列之代码实现

    代码源码 前情回顾:[论文笔记]R-CNN系列之论文理解 整体架构 由三部分组成 (1)提取特征的卷积网络extractor (2)输入特征获得建议框rois的rpn网络 (3)传入rois和特征图, ...

  9. pandas基础--缺失数据处理

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  10. Java中的包(Package)

    # 包(Package) **为方便管理类(按照不同的功能管理类),解决同名问题的发生** - 使用`package关键字`修饰包 - **类名(全类名)=包名(地址)+类名简称** ```java ...