当前位置: 首页 > news >正文

自定义BeanPostProcessor之XssBeanPostProcessor

什么是BeanPostProcessor

BeanPostProcessor是Spring框架中的一个重要的扩展点,它允许开发者在Bean初始化前后对Bean进行自定义处理。Spring中有很多内置的BeanPostProcessor,如AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、InitDestroyAnnotationBeanPostProcessor等。

开发者也可以自定义BeanPostProcessor,只需要实现BeanPostProcessor接口即可。BeanPostProcessor接口有两个方法:

  • postProcessBeforeInitialization(Object bean, String beanName):在Bean初始化之前执行
  • postProcessAfterInitialization(Object bean, String beanName):在Bean初始化之后执行

自定义BeanPostProcessor

自定义BeanPostProcessor也可以用来做许多有用的事情,如:

  • 根据Annotation自动为Bean注入依赖
  • 在Bean初始化后执行某些操作
  • 利用代理机制为Bean添加一些行为

下面是一个简单的自定义BeanPostProcessor例子。
XssFilter是一个安全过滤组件,对提交的内容进行过滤,作为jar包引入。
但是为了动态的增加不过滤的url,选择从配置中读取配置,动态修改fliter的urlExclude。

@Component
public class XssBeanPostProcessor implements BeanPostProcessor, EnvironmentAware {private Environment environment;private static String FIELD_FILTER = "filter";private static String FIELD_URLEXCLUSION = "urlExclude";private static String CONFIG_PROPERTY = "fliterUrl";private static String beanNameOfFilterBean = "org.springframework.boot.web.servlet.FilterRegistrationBean";@Overridepublic Object postProcessBeforeInitialization(Object o, String s) throws BeansException {return o;}@SneakyThrows@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof FilterRegistrationBean) {try {String name = bean.getClass().getName();Class beanNameClz = Class.forName(name);changeField(beanNameClz, FIELD_FILTER, bean);} catch (Exception e) {e.printStackTrace();}}return bean;}private void changeField(Class clazz, String fieldName, Object obj) throws Exception {Object value = getField(clazz, fieldName, obj);// 获取到XssFilter过滤器if (Objects.nonNull(value) && value instanceof XssFilter) {XssFilter xssFilter = (XssFilter) value;// XssFilter的属性urlExclude为不过滤的urlObject urlExclusionValue = getField(xssFilter.getClass(), FIELD_URLEXCLUSION, xssFilter);// 获取配置中不过滤的urlString property = environment.getProperty(CONFIG_PROPERTY );if (Objects.nonNull(urlExclusionValue) && urlExclusionValue instanceof List && !StringUtils.isEmpty(property)) {List list = (List) urlExclusionValue;String[] split = property.split(",");List<String> objects = Lists.newArrayList(Arrays.asList(split));objects.addAll(list);Field field = ReflectionUtils.findField(xssFilter.getClass(), FIELD_URLEXCLUSION);// 反射修改ReflectionUtils.setField(field, value, objects);}}}private Object getField(Class clazz, String fieldName, Object obj) throws Exception {Field field = ReflectionUtils.findField(clazz, fieldName);if (Objects.nonNull(field)) {ReflectionUtils.makeAccessible(field);Object value = field.get(obj);return value;}return null;}@Overridepublic void setEnvironment(Environment environment) {this.environment = environment;}
}
http://www.lryc.cn/news/249720.html

相关文章:

  • 如何使用Windows自带的IIS服务搭建本地站点并远程访问
  • 【微软技术栈】基于任务的异步编程
  • react hooks 学习之react router v6 路由表配置
  • Echarts 设置数据条颜色 宽度
  • 2023-11-30 通过中缀表达式转换后缀表达式, 用C语言完成一个简单的计算器
  • 设计模式总目录
  • 通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践
  • 键入网址到网页显示,期间发生了什么?(计算机网络)
  • python-GC机制、装饰器、生成器、迭代器、三元表达式、列表生成式、生成器表达式、函数递归、面向对象、
  • Linux命令--根据端口号查看进程号(PID)
  • LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  • 使用 Vue3 + Pinia + Ant Design Vue3 搭建后台管理系统
  • SpringCloud核心组件
  • 基于C++11实现将IP地址、端口号和连接状态写入文件
  • 非空断言,
  • Spark---创建DataFrame的方式
  • 瑜伽学习零基础入门,各种瑜伽教学方法全集
  • pycharm编译报错处理
  • “华为杯”研究生数学建模竞赛2019年-【华为杯】E题:基于多变量的全球气候与极端天气模型的构建与应用(附python代码实现)
  • 冒泡排序(适合编程新手的体质)
  • pdfjs,pdf懒加载
  • K8s 多租户方案的挑战与价值
  • 单链表相关经典算法OJ题:移除链表元素
  • 【JUC】十九、volatile与内存屏障
  • 下载MySQL JDBC驱动的方法
  • C/C++ 实现FTP文件上传下载
  • 第十三章 python之爬虫
  • scrum 敏捷开发
  • 亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试
  • 深度学习(一):Pytorch之YOLOv8目标检测