如何快速在 Springboot 中集成拦截器? | 原力计划

2020 年 5 月 7 日 CSDN

作者 | 才疏学浅
责编 | 夕颜
出品 | CSDN(ID:CSDNnews)

话不多说,直接上货!


拦截器的作用


拦截器提供了一种机制,在访问action前后进行一些操作,因为拦截器的这个特性,那么我们就可以利用拦截器做一些事情,比如监控访问人数,拦截一些非法请求,记录访问日志,身份验证之类的


构建拦截器


2.1 创建拦截器


1.创建类实现HandlerInterceptor接口


2.HandlerInterceptor有三种拦截方式


`preHandle` :在访问controller调用之前


`postHandle` :请求访问controller之后,渲染视图之前


`afterCompletion` :请求访问controller之后,渲染视图之后


3.返回值为boolean


  • true: 请求在经过验证校验以后,是OK的,是可以放行的

  • false: 请求被拦截,被驳回,验证出现问题


代码示例:


package com.imooc.interceptor;
import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import java.io.IOException;import java.io.OutputStream;

import static com.imooc.controller.BaseController.REDIS_USER_TOKEN;

public class UserTokenInterceptor implements HandlerInterceptor {

/** * 拦截请求,在访问controller调用之前 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("进入拦截器");


/** * false: 请求被拦截,被驳回,验证出现问题 * true: 请求在经过验证校验以后,是OK的,是可以放行的 */ return true; }

/** * 请求访问controller之后,渲染视图之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

} /** * 请求访问controller之后,渲染视图之后 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}}

2.2 注册拦截器


1.创建类实现WebMvcConfigurer接口

2.注册创建的拦截器


@Bean
public UserTokenInterceptor userTokenInterceptor() { return new UserTokenInterceptor(); }

3.重写addInterceptors 添加监听的路径


  • addPathPatterns 添加监听的路径地址

  • excludePathPatterns 排除一些路径

代码示例:


package com.imooc.config;


import com.imooc.interceptor.UserTokenInterceptor;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {


@Bean public UserTokenInterceptor userTokenInterceptor() { return new UserTokenInterceptor(); }

/** * 注册拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(userTokenInterceptor()) .addPathPatterns("/hello") .addPathPatterns("/shopcart/add") .addPathPatterns("/shopcart/del") .addPathPatterns("/address/list") .addPathPatterns("/address/add") .addPathPatterns("/address/update") .addPathPatterns("/address/setDefalut") .addPathPatterns("/address/delete") .addPathPatterns("/orders/*") .addPathPatterns("/center/*") .addPathPatterns("/userInfo/*") .addPathPatterns("/myorders/*") .addPathPatterns("/mycomments/*") .excludePathPatterns("/myorders/deliver") .excludePathPatterns("/orders/notifyMerchantOrderPaid");

WebMvcConfigurer.super.addInterceptors(registry); }

}


拦截器错误信息返回前端


因为拦截器返回的结果是布尔类型的,所有不能直接返回信息,那怎么办呢,我们可以利用output输出流来写入response中,这样前台就可以获取到了。

代码如下:


public void returnErrorResponse(HttpServletResponse response,
String result) { OutputStream out = null; try { response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out = response.getOutputStream(); out.write(result.getBytes("utf-8")); out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } }

}

原文链接:

https://blog.csdn.net/qq_38446413/article/details/105819433



更多精彩推荐

☞我们想研发一个机器学习框架,6 个月后失败了

☞生产型机器学习已经没那么困难了?

视频 | 你不知道的"开源"60年秘史

GitHub标星10,000+,Apache项目ShardingSphere的开源之路

阿里技术专家告诉你,如何画出优秀的架构图?

加拿大API平台如何做到30%为中国明星项目?创业老兵这样说……

你点的每个“在看”,我都认真当成了喜欢
登录查看更多
0

相关内容

【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
专知会员服务
109+阅读 · 2020年3月12日
领域知识图谱构建,115页2019著作带你学习KGC(附下载)
专知会员服务
82+阅读 · 2020年1月9日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【课程】伯克利2019全栈深度学习课程(附下载)
专知会员服务
56+阅读 · 2019年10月29日
《DeepGCNs: Making GCNs Go as Deep as CNNs》
专知会员服务
30+阅读 · 2019年10月17日
如何给你PyTorch里的Dataloader打鸡血
极市平台
15+阅读 · 2019年5月21日
Github项目推荐 | Pytorch TVM 扩展
AI研习社
11+阅读 · 2019年5月5日
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
超级!超级!超级好用的视频标注工具
极市平台
8+阅读 · 2018年12月27日
手把手 | 关于商业部署机器学习,这有一篇详尽指南
教程 | 如何通过PyTorch上手Tensor Comprehensions?
机器之心
5+阅读 · 2018年3月12日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
深度学习入门篇--手把手教你用 TensorFlow 训练模型
全球人工智能
4+阅读 · 2017年10月21日
Arxiv
101+阅读 · 2020年3月4日
Monocular Plan View Networks for Autonomous Driving
Arxiv
6+阅读 · 2019年5月16日
Arxiv
6+阅读 · 2018年11月1日
Knowledge Based Machine Reading Comprehension
Arxiv
4+阅读 · 2018年9月12日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关资讯
如何给你PyTorch里的Dataloader打鸡血
极市平台
15+阅读 · 2019年5月21日
Github项目推荐 | Pytorch TVM 扩展
AI研习社
11+阅读 · 2019年5月5日
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
超级!超级!超级好用的视频标注工具
极市平台
8+阅读 · 2018年12月27日
手把手 | 关于商业部署机器学习,这有一篇详尽指南
教程 | 如何通过PyTorch上手Tensor Comprehensions?
机器之心
5+阅读 · 2018年3月12日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
深度学习入门篇--手把手教你用 TensorFlow 训练模型
全球人工智能
4+阅读 · 2017年10月21日
相关论文
Arxiv
101+阅读 · 2020年3月4日
Monocular Plan View Networks for Autonomous Driving
Arxiv
6+阅读 · 2019年5月16日
Arxiv
6+阅读 · 2018年11月1日
Knowledge Based Machine Reading Comprehension
Arxiv
4+阅读 · 2018年9月12日
Arxiv
3+阅读 · 2012年11月20日
Top
微信扫码咨询专知VIP会员