在SpringBoot项目中整合拦截器
拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
1.权限检查:如登录检测,进入处理程序检测用户是否登录,如果没有,则直接返回登录页面或error错误页面;
2.性能检测:有时系统在某段时间莫名其妙很慢,我们可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间;
3.通用行为;读取cookie得到用户信息并将用户对象放入请求,从而方便后序流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可以使用功能拦截器实现。
下面我来详细介绍如何在SpringBoot项目中搭建拦截器的步骤。
1.创建一个SpringBoot项目工程
打开IDEA,点击文件,选择新建项目,点击Spring Initializr,然后根据自己的需求设置项目名称,位置以及JDK。这里需要注意,服务器的URL最好设置为阿里云服务器,这样可以使得项目加载地更快。
点击下一步后 ,选择2.4.1的SpringBoot版本 ,导入Spring Web依赖后点击完成即可。
2.配置自定义的拦截器
在自定义的拦截器类中要继承HandlerInterceptor,只有继承了HandlerInterceptor 的类才算是一个拦截器,同时根据需求重写preHandle,postHandle以及afterCompletion方法。
具体编辑的拦截器如下所示:代码中的url请求将在controlelr控制器中编写。另外需要注意的是User是一个实体类,包括id与username两个属性以及set,get方法,这里就不具体展示了。
package com.xing.springbootinterceptor.interceptor;import com.xing.springbootinterceptor.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定义的拦截器 只有继承了HandlerInterceptor 自定义的类才算是一个拦截器
public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//编写拦截的规则//判断用户是否登录 从session中取值User user=(User) request.getSession().getAttribute("user");if(user==null){//未登录response.sendRedirect(request.getContextPath()+"/user/error");//重定向return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}
3.注册拦截器
编写完自定义的拦截器后,我们还需要将自定义的拦截器注册到Java的配置类中,方便SpringBoot项目启动的时候读取Config配置类。
我们需要创建一个类,实现WebMvcConfigurer接口并在类名上使用 @Configuration注解 表明这是一个配置类,其实就类似于我们在SpringMVC中的XML配置文件,不过现在就用纯Java代码配置而已。
然后在该类中实现 addInterceptors方法,从而把需要拦截的请求以及需要排除的请求注册进去,方便项目启动后的读取。
package com.xing.springbootinterceptor.config;
import com.xing.springbootinterceptor.interceptor.UserInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;//表明这是一个配置类 即相当于之前的xml配置文件
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {//这个配置类主要用来添加拦截请求@Overridepublic void addInterceptors(InterceptorRegistry registry) {String[] addPathPatterns={"/user/**"};//设置拦截的路径 不设置将会拦截所有的请求String[] excludePathPatterns={"/user/out","/user/error","/user/login"};//要排除的路径 排除的路径说明不需要用户登录也可以访问//InterceptorRegistry 拦截器注册类registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
// WebMvcConfigurer.super.addInterceptors(registry);}
}
4.编写控制器
前面展示了不少的url请求,相信没有看到具体的控制器一定有点晕头转向的,这就展示控制器的具体代码,如下所示:
package com.xing.springbootinterceptor.controller;
import com.xing.springbootinterceptor.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController //该注解相当于@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public String login(HttpServletRequest request){//这里只是模拟登录 一旦输入该请求 则表示登录成功 便我往session中存值User user = new User();user.setId(1001);user.setUsername("张三");//将用户的信息存放到session中request.getSession().setAttribute("user",user);return "login success";}//该请求需要用户登录之后才可访问@RequestMapping("/center")public String center(){return "See Center Message";}//该请求不登录也可以访问@RequestMapping("/out")public String out(){return "Out See anytime";}//如果用户未登录访问了需要登录的请求 便会自动跳转到该路径@RequestMapping("/error")public String error(){return "error";}
}
通过查看控制器的代码相信大多数小伙伴就能猜测到具体项目演示的结果了,这里就不具体展示运行的效果了。
在SpringBoot项目中整合拦截器相关推荐
- 第六章:如何在SpringBoot项目中使用拦截器
拦截器对使用SpringMvc.Struts的开发人员来说特别熟悉,因为你只要想去做好一个项目必然会用到它.拦截器在我们平时的项目中用处有很多,如:日志记录(我们后续章节会讲到).用户登录状态拦截.安 ...
- 如何在SpringBoot项目中使用拦截器
相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebM ...
- ssm项目中使用拦截器加上不生效解决方案
ssm项目中使用拦截器加上不生效解决方案 参考文章: (1)ssm项目中使用拦截器加上不生效解决方案 (2)https://www.cnblogs.com/xiufengchen/p/11205283 ...
- 玩转 SpringBoot 2 快速整合拦截器
概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器(HandlerInterceptor).使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInt ...
- SpringBoot项目使用JWT+拦截器实现token验证
利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...
- Springboot项目Aop、拦截器、过滤器横向对比
前言 伟人曾经说过,没有调查就没有发言权(好像是伟人说的,不管谁说的,这句话是正确的),有些东西看着简单,张口就来,但很有可能是错的.我个人的经验是,aop.过滤器.拦截器的实现方式很简单,一学就会, ...
- 小编教您Springboot项目中异常拦截设计与处理
项目运行过程中会出现各种各样的问题,常见的有以下几种情况: 业务流程分析疏漏,对业务流程的反向操作.边界分析设计不充分 调用外部服务.调用外部系统出现的超时.错误.返回值与预期不符 外部资源连通性问题 ...
- SSH项目中遇到拦截器无法注入服务的问题
2019独角兽企业重金招聘Python工程师标准>>> 配置applicationContext.xml,给自定义拦截器增加了properity属性是一个biz,运行的时候一直报空指 ...
- (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)
1. 过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...
最新文章
- minus oracle 顺序_oracle minus的用法来一波
- inotifypropertychanged接受不执行_死刑立即执行很好理解,缓期2年执行是什么意思?是2年后再执行吗...
- 程序员面试金典 - 面试题 17.13. 恢复空格(DP+Trie树)
- 下载--保存(下载)文件到本地(.doc .jpg)
- docker-compose RabbitMQ与Nodejs接收端同时运行时的错误
- android lottie字体json,Android Lottie集成及基本用法
- 《统计学》基础知识归纳
- Oracle 的 Round函数详解
- 双系统时间不一致问题
- unity 敌人朝向主角
- LaTeX 多图 排列
- MailConnectException: Couldn‘t connect to host
- Codeforces Round #827 (Div. 4) D - F
- Sigar获取网卡流量信息
- rapidly exploring random tree(快速搜索随机树)路径规划
- SV学习(2)——过程语句、函数和任务、变量声明周期
- 给所有想爱、正在爱、失去爱的人(转)
- js 使用sm2 国密加密
- 如何手动下载最新的 macOS Beta 完整镜像?
- KillFiles 文件粉碎器界面设计优化
热门文章
- Android中的px、ppi(dpi)、dp(dip)、sp
- 计算机更新一直在57转怎么办,联想电脑正在更新怎么办
- OpenSSL 修复三个新漏洞
- 解决cmd无法使用pip,报错“pip Fatal error in launcher: Unable to create process using ... “的问题
- 人工智能诊断皮肤癌准确率达 91%
- 他励直流电机 | 起动、调速、制动原理与Simulink仿真
- javascript 判断map为空
- 第一个MFC项目创建
- 微信开放平台·微信公众号接口调用报错【“errcode“:48001“errmsg“:“api unauthorized...“】
- Python 打造一个语音合成系统