45. 从零开始学springboot撸一个Xss过滤器-注解实现

Java+SpringBoot高考志愿填报智能辅助系统设计与实现 高考志愿填报是考生和家长在短时间内面临的海量信息筛选与决策难题。如何用技术手段将零散的院校数据、专业组信息、历年录取位次高效整合,并转换为可理解的推荐结果,是这类业务系统的核心价值所在。SpringBoot作为Java生态中主流的微服务开发框架,提供了快速构建数据接口、整合缓存与限流组件的能力。结合基于位次法和线差法的加权评分算法,系统能够为考生提供“冲稳保”三档志愿推荐,并通过缓存预热、Sentinel限流与降级策略应对出分日的流量高峰。从数据表结构设计、同位分换算、推荐引擎实现到Docker部署,这套方 阅读详情

前言

上章通过Filter实现了Xss全局过滤器

可能小伙伴还有点不满, 全局意味着“一刀切”,
虽然我们也有白名单黑名单设置, 但是, 白名单黑名单针对的是整个方法或整个实体类

举个例子, 我定义了个实体

public class People {
    private String name;
    private String info;
    private String des;
}

可能业务上有限制(比如name限制了只有5个字符长),

那么name其实不可能存在Xss注入风险了,

程序只需要对info和des属性做转义即可

如果采用Filter, 意味着People的所有属性都会检测转义, 好像没啥必要!

那么, 可以针对性的指定字段进行Xss的过滤转义么?

为了应对这样的需求, 咸鱼君采用Aop注解来实现这么个Xss过滤器.

PS: 和Filter一样, 我们统一对入参Xss过滤, 确保参数的处理方式统一! 所以, 程序中获取的参数值都是转义后的数据!!

废话不多说, 往下看!

代码实现

加入必要的pom依赖

       <!--Aop依赖 -->
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!--HuTool工具包 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>

        <!-- 实用工具 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

针对方法, 参数, 属性分别定义三个注解

XssMethod

/**
 * @Description: 注解在方法上,表示该方法中的参数需要预防XSS
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XssMethod {

}

XssParam

/**
 * @Description: 注解在参数上,表示该参数需要预防XSS
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface XssParam {

}

XssField

/**
 * @Description: 注解在字段上,表示该字段需要预防XSS
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XssField {

}

针对注解实现切面Aspect

XssAspect

/**
 * @Description: AOP防XSS攻击
 */
@Aspect
@Slf4j
@Component
public class XssAspect {
    @PostConstruct
    public void init() {
        log.info("XssAspect init ......");
    }

    @Around("@annotation(xssMethod)")
    public Object around(ProceedingJoinPoint joinPoint, XssMethod xssMethod) throws Throwable {
        Object[] args = joinPoint.getArgs();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 获取所有参数上的注解(一个参数可能对应多个注解,因此获取到的是一个二维数组。)
        Annotation[][] paramsAnnotations = signature.getMethod().getParameterAnnotations();
        // 遍历一维数组,获取每个参数对应的注解数组
        for (int i = 0; i < paramsAnnotations.length; i++) {
            Annotation[] paramAnnotations = paramsAnnotations[i];
            // 遍历每个参数的注解数组
            for (Annotation annotation : paramAnnotations) {
                // 如果参数需要预防XSS攻击
                if (annotation instanceof XssParam) {
                    // 如果是String类型,将其进行格式化
                    // 否则获取该类型的所有字段,对String类型的字段进行格式化
                    if (args[i] instanceof String && StrUtil.isNotEmpty((String) args[i])) {
                        args[i] = format((String) args[i]);
                    } else {
                        Class clazz = args[i].getClass();
                        // 获取类的所有字段
                        Field[] fields = clazz.getDeclaredFields();
                        for (Field field : fields) {
                            // 如果字段上有@PreventXSSField注解
                            if (field.getDeclaredAnnotation(XssField.class) != null) {
                                // 如果是字段不可访问,设置临时可访问
                                if (!field.isAccessible()) {
                                    field.setAccessible(true);
                                }
                                // 如果字段是字符串类型则进行格式化
                                Object fieldValue = field.get(args[i]);
                                if (fieldValue instanceof String && StrUtil.isNotEmpty((String) fieldValue)) {
                                    field.set(args[i], format((String) fieldValue));
                                }
                            }
                        }
                    }
                }
            }
        }
        // 将参数覆盖到到原方法
        Object proceed = joinPoint.proceed(args);
        return proceed;
    }

    /**
     * 对需要防范的字符串进行格式化
     */
    public String format(String xssStr) {
        return EscapeUtil.escape(xssStr);
    }
}

注释写的很详细, 就不多废话了!

接下来我们写个案例来测试测试

首先在启动类上启用切面

@SpringBootApplication
@EnableAspectJAutoProxy
public class XssaopApplication {

    public static void main(String[] args) {
        SpringApplication.run(XssaopApplication.class, args);
    }
}

定义一个实体People, 并对info,des属性加上注解进行xss过滤

@Setter
@Getter
public class People {
  
    private String name;

    @XssField
    private String info;

    @XssField
    private String des;
}

最后编写controller

@RestController
@Slf4j
public class XssController {

    @PostMapping("xssFilter")
    @XssMethod
    public String xssFilter(@XssParam String name, String info) {
        log.error(name + "-----" + info);
        return name + "---" + info;
    }

    @XssMethod
    @PostMapping("modelXssFilter")
    public People modelXssFilter(@RequestBody @XssParam People people) {
        log.error(people.getName() + "-----" + people.getInfo());
        return people;
    }
}

json方式
image.png

键值对方式
image.png

项目地址

https://github.com/MrCoderStack/SpringBootDemo/tree/master/sb-xssaop

请关注我的订阅号

订阅号.png

SpringBoot+Vue知识管理系统:从架构设计到部署上线的全栈实践 在Web应用开发领域,前后端分离架构已成为主流范式,它通过清晰的职责划分提升了开发效率和系统可维护性。其核心原理在于前端负责用户界面与交互,通过HTTP API与后端进行数据通信;后端则专注于业务逻辑处理、数据持久化和安全控制。这种架构的技术价值在于支持技术栈灵活选型、便于团队协作并行开发,并能适应现代云原生部署需求。典型的应用场景包括各类后台管理系统、内容管理平台和企业级应用。本文以知识管理系统为例,深入剖析了如何运用SpringBoot和Vue技术栈实现一个功能完整的全栈项目,其中涉及基于角色的访问控制 阅读详情

相关推荐

SpringBoot+Vue知识管理系统:毕业设计与实战全流程详解

知识管理系统是Web应用开发的经典实践,它通过构建中心化知识库,实现对文档的分类、存储、检索与共享。其核心原理在于采用前后端分离架构,后端通过RESTful API提供数据服务,前端负责交互展示。这种架构的技术价值在于职责清晰、易于维护和独立部署,是现代企业级应用的主流模式。在应用场景上,它广泛适用于团队协作、学习小组及个人知识管理。本文以SpringBoot和Vue.js这一主流技术栈为例,深入剖析了从数据库设计、用户认证到富文本编辑器集成等核心模块的实现,并分享了JWT认证、全局异常处理等实战经验,为构

weixin_42668301的博客 351

SpringBoot通过AOP实现Xss攻击拦截

SpringBoot通过AOP实现Xss攻击拦截

一恍过去 1万+

智能家居毕设系统骨架:SpringBoot2.7+Vue2.6+MySQL5.7实战

智能家居系统本质是融合设备接入、实时通信与权限管控的小型IoT平台,其核心在于协议抽象能力、状态同步机制与轻量级RBAC模型。SpringBoot作为企业级后端主流框架,提供开箱即用的Web容器与安全组件;Vue凭借成熟的DevTools和简洁的路由守卫,更适配毕设阶段的快速联调与权限可视化;MySQL 5.7则以低内存占用、稳定JSON处理及RANGE分区能力,支撑设备历史数据高效归档与查询。该技术组合并非过时妥协,而是面向学生开发环境与评审要求的工程理性选择——兼顾可调试性、可解释性与可扩展性,适用于毕

weixin_36238982的博客 318

使用过滤器解决xss攻击、SQL注入问题,自定义注解+aop+反射解决xss攻击问题

一、过滤器和拦截器的区别: 不同点: 过滤器的执行顺序在拦截前 过滤器基于servlet,而拦截器是基于框架,springmvc 过滤器是基于函数回调,而拦截器是基于Java的反射机制 参考博客:https://blog.csdn.net/zxd1435513775/article/details/80556034 二、基于过滤器解决xss问题 (1)、什么是xss问题 xss问题就是脚本攻击,是指在参数中携带一些script脚本等能在HTML执行的脚本,从而呈现...

qq_37948985的博客 2714

Spring Boot+Vue全栈实战:构建高并发美食分享社区的技术架构与实现

在现代Web应用开发中,前后端分离架构与微服务理念已成为主流实践。其核心原理在于将前端展示与后端业务逻辑解耦,通过RESTful API进行通信,从而提升开发效率与系统可维护性。这种架构的技术价值在于支持团队并行开发、技术栈灵活选型以及更好的用户体验。典型的应用场景包括内容社区、电商平台等需要快速迭代和复杂交互的系统。本文以构建一个地方美食分享社区为例,深入探讨了如何运用Spring Boot、MyBatis-Plus、Vue 3等技术栈实现核心功能。其中,针对高并发场景下的**点赞、收藏**等互动操作,详

weixin_29251131的博客 301

Spring Boot+Vue智能记账系统:前后端分离毕业设计实战指南

在Web开发领域,前后端分离架构已成为现代应用开发的主流范式,其核心在于通过定义清晰的API契约,实现前端用户界面与后端业务逻辑的解耦与独立演进。这种架构模式的技术价值在于提升了开发效率、便于团队协作,并增强了系统的可维护性和可扩展性。在实际工程实践中,如何将Spring Boot与Vue.js这两大主流技术栈有效结合,构建一个功能完整、性能可靠的应用,是许多开发者面临的挑战。本文聚焦于一个具体的应用场景——大学生智能消费记账系统,深入探讨了从技术选型、模块设计到部署运维的全过程。其中,针对**前后端分离详

weixin_42393362的博客 250

用自定义注解替代@RequestBody实现xss过滤的尝试

需求背景 post请求中的body参数,会解析成 @RequestBody 注解的对象。现在需要把该对象的所有string属性进行XSS过滤,XSS过滤是已有的轮子。 设计思路 面向扩展开放,面向修改关闭原则。新定义一个注解解决这类问题:@XssCleaned @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) ...

weixin_34026484的博客 1968

XSS跨站脚本攻击在Java开发中防范的方法

XSS跨站脚本攻击在Java开发中防范的方法

aop 切面

applicationContext.xml配置切面,扫描Service下所有的类&lt;!-- 切面 --&gt;    &lt;bean id="dataIllegal" class="com.golden.msale.framework.aop.DataIllegalAop" /&gt;        &lt;!-- 配置AOP --&gt;        &lt;aop:config&gt...

qq_31940749的博客 202

量子密钥分发(QKD)原理、工程实现与实战部署全解析

密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码

weixin_29324401的博客 344

COCO2017数据集类别分布深度解析

本文深入解析了COCO2017数据集的类别分布情况,包括80个常见物体的分类统计和样本数量分析。通过对比训练集与验证集的分布一致性,探讨了数据均衡性问题,并针对高频和低频类别提出了实用的数据预处理和模型训练建议,帮助优化计算机视觉任务的性能。

weixin_42533751的博客 369

SpringBoot从入门到放弃-跨域问题解决方案

要解决浏览器的跨域问题,则需要了解什么是跨域。在了解跨域概念的基础上,才能从根本寻找解决方案,本文将从跨域的原因以及在springboot中如何解决跨域进行展开。 1.什么是跨域 由于浏览器具有同源策略,同源策略是一个重要的安全策略,它用于限制一个源的文档或者其加载的脚本如何与另一个源的资源进行交互。它能够帮助阻隔恶意的文档,减少被攻击的可能。 ...

qq_33479841的博客 1518

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-优快云博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3163

SpringBoot学习交流平台架构设计与实战

SpringBoot作为现代Java开发的主流框架,通过自动配置和starter依赖机制大幅提升了微服务开发效率。其核心原理是基于约定优于配置的理念,内嵌Tomcat容器简化了部署流程。在在线教育领域,SpringBoot的快速迭代特性特别适合构建学习交流平台这类需要频繁更新的应用。通过整合Spring Security实现RBAC权限控制,结合Elasticsearch优化搜索性能,并采用WebSocket+Redis构建实时消息系统,可以打造高可用的学习社区。实践中发现,合理的JVM参数调优能使API响

weixin_34379433的博客 357

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1306

探秘RK3588:OverlayFS挂载与固件升级全攻略

本文围绕RK3588芯片的OverlayFS文件系统挂载与固件升级技术展开详细阐述。首先介绍了RK3588芯片的卓越性能及其在嵌入式领域的广泛应用,重点分析了OverlayFS文件系统的分层架构原理及其在RK3588设备上的挂载方法,包括详细的挂载步骤、常见问题解决方案。随后详细阐述了RK3588设备在Windows和Linux环境下的固件升级方案,涵盖升级准备、具体操作流程及故障处理等内容。最后通过智能安防监控设备的实际案例,展示了OverlayFS挂载与固件升级技术的应用效果。文章为嵌入式开发者提供了全

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 285

Spring boot 跨域请求实现方式汇总

目录 什么是跨域? 常见跨域场景 jsonp 跨域 Jsonp - 前端 JavaScript Jsonp - 服务器 Jsonp - 跨域测试 Cors 跨域 Cors - 前端 JavaScript Cors - 服务器 Cors - 跨域测试 Access-control-Allow-Origin 多域名设置 什么是跨域? 1、前后端数据交互经常会碰到请求跨域,...

蚩尤后裔-汪茂雄 6476

cesium vue2/vue3教程目录导航

以下是本专栏目录导航,送完整项目源码(拒绝单页源码),可以直接运行,全部配置免费视频教程(B站)。

qq_29384639的博客 4312

Spring Boot之FilterRegistrationBean-自定义Filter详解

Spring Boot之FilterRegistrationBean-自定义Filter详解

gb4215287的博客 1750

33、AI赋能5G/6G通信:LDPC码解码与强化学习技术解析

本文探讨了基于AI和强化学习的LDPC码技术在5G/6G通信中的应用。包括LAMS解码器、神经MS解码器、盲识别方法、统一极性-LDPC解码器、NNMS和SNNMS解码器、N-2D-NMS解码器、神经分层MS解码器、MAB-NS方案以及强化学习与MCTS结合的技术。这些技术在提升解码性能、降低计算复杂度和增强系统适应性方面表现出色,为未来通信系统的发展提供了强有力的支持。

lambda的博客 241

假新闻检测论文分享(25)L-DefenseExplainable Fake News Detection With Large Language Model

现有的假新闻检测工作主要集中在通过深度网络结合多种信息来学习假新闻的潜在特征,如可信度、立场、传播模式、额外知识、域外数据等。尽管他们在探测上取得了成功,但受限于他们的黑箱性质,他们无法提供任何对公众至关重要的理由。为解决这一问题,一些研究致力于可解释假新闻检测(EFND),旨在同时生成准确性预测和解释。许多工作通过注意力机制在相关报道中注意突出特别的单词、短语或句子来提供可解释性。然而,这些工作只发现了对最终预测有高贡献的区域,缺乏直观和可信的解释。

weixin_41964296的博客 730

SpringBoot+Vue在线拍卖系统架构与实战

在线拍卖系统作为典型的电商应用,其核心技术涉及高并发事务处理与实时数据同步。通过SpringBoot实现的后端服务采用MySQL行级锁保证竞价事务的ACID特性,结合@Transactional注解有效防止超卖问题。前端基于Vue 3的WebSocket长连接实现价格实时推送,配合防抖控制优化用户体验。这种前后端分离架构不仅适用于拍卖场景,也可扩展至秒杀、众筹等需要强一致性的互联网业务。系统经过生产验证的SpringBoot+Vue+MySQL技术栈,为开发者提供了包含Docker部署、Nginx配置在内的

hqmln的博客 485

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java最高频八股文速通

final 类:String 类被声明为 final,这意味着它不能被继承,从而防止了通过继承改变其行为。final 字段:String 类中的 value 字段是 final 的,这保证了 String 对象在创建后其内部字符数组不会被改变。没有提供修改方法:String 类没有提供任何可以修改其内容的方法。所有对 String 的操作(如拼接、替换等)都会生成一个新的String 对象。

qq_43751506的博客 6395

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

面试问题总结

文章目录1.abstract和interface异同2.构造方法3.final关键字作用4.重写和重载的区别4.1重载4.2重写5.this关键字6.封装的作用,实现封装的步骤7.封装中的getter和setter方法分别作用7.1setter方法7.2getter方法8.Mybatis-plus与Spring Data JPA9.装箱和拆箱9.1装箱9.2拆箱10.ArrayList底层原理11.反射12.Filter13.$与#的区别14.js中的DOM对象与jQuery中的DOM区别15.四大元注解1

肥猫不是猫 1109

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

147.【2024Java八股-全网最全-10w字】

eg: 学校、院校、经验、年龄、跳槽频率…基本包括16种常见使用场景: 、数据共享分布式、、全局 ID、计数器、限流、位统计、购物车、用户消息时间线 timeline、、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜.详细讲解16种使用场景: https://blog.csdn.net/zxl646801924/article/details/123202381用户使用id进行查询文章的时候,首先会查询redis数据库,如果在redis中命中数据,那么redis就向用户返回查询的结果

qq_69683957的博客 1736

第3章 从0开始用若依

若依(RuoYi)框架是一款基于Spring Boot、Spring Cloud等开源框架搭建的企业级开发平台。它的主要目标是提供全面的解决方案,以简化企业级应用开发提高开发效率。模块化设计:若依框架采用模块化的设计,使得应用可以根据需求进行灵活的扩展和定制。每个模块都可以独立部署和升级,这大大提高了系统的可维护性和可扩展性。前后端分离:框架采用前后端分离的开发模式,后端专注于数据处理和API接口的提供,前端则负责页面的展示和用户交互。这种模式使得前后端职责明确,进一步提高了开发效率和代码的可维护性。

m0_73919023的博客 284
上一篇: 44. 从零开始学springboot撸一个Xss过滤器-Filter实现
下一篇: 摸鱼JVM - 几个常识概念启蒙 (老鸟请跳过)
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值