SpringMVC controller 所有接收的参数,进行String进行HTML编码

本文介绍了一种通过HTML编码防止XSS攻击的方法,在Spring MVC框架中利用@ControllerAdvice注解实现全局请求参数的安全处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@ControllerAdvice

public class BaseControllerAdvice {

        @InitBinder

        protected void initBinder(WebDataBinder webDatabinder) {
//controller 所有接收的参数,进行String进行HTML编码,防止XSS攻击
binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
public String getAsText() {
Object text= getValue();
return text!= null ? text.toString() : "";
}

public void setAsText(String text) {
setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
}
});
}

}

### SpringMVC 接收请求参数的数据绑定机制 #### 1. 数据绑定的概念 SpringMVC 的数据绑定是指将 HTTP 请求中的参数自动映射到控制器方法的参数上。这一过程的核心在于解析 `key=value` 形式的请求参数,并将其转换为目标类型的对象[^2]。 #### 2. 绑定机制 当客户端发送请求时,SpringMVC 会根据请求参数的名字与控制器方法参数名字的一致性来完绑定操作。如果两者匹配,则会尝试将请求参数值赋给对应的控制器方法参数[^3]。例如: ```java @RequestMapping("/findAccount") public String findAccount(@RequestParam("accountId") int accountId) { System.out.println("AccountId: " + accountId); return "success"; } ``` 上述代码中,`@RequestParam` 注解用于显式指定请求参数名与方法参数之间的对应关系[^4]。 #### 3. 支持的数据类型 SpringMVC 支持多种数据类型的绑定,主要包括以下几类: - **基本数据类型和字符串** 对于简单的 GET 或 POST 请求,可以直接传递基础数据类型(如 `int`, `double`, `String` 等),并由框架自动完类型转换。 - **实体类型(JavaBean)** 如果表单字段与 JavaBean 属性一致,SpringMVC 可以直接将这些字段封装一个完整的对象实例。例如: ```java @RequestMapping("/saveAccount") public String saveAccount(Account account) { System.out.println(account.toString()); return "redirect:/success.jsp"; } ``` 这里假设 `Account` 是一个包含多个属性的标准 Java 类型,其字段需提供 getter 和 setter 方法以便框架访问。 - **集合数据类型(List, Map 等)** 集合形式的支持允许更复杂结构化数据传输。比如数组或者列表可以通过索引方式传入,而键值对则适合用 map 来表示。 #### 4. 使用要求 为了确保功实现参数绑定,需要注意以下几个方面: - 提交表单时定义的 name 属性应同处理器函数形参保持一致; - 若存在嵌套对象情况,那么路径表达式应当反映实际层次关系; - 当遇到自定义日期格式等问题时可以考虑注册 Converter 转换器服务[^1]。 #### 5. 解决乱码问题 对于中文字符可能出现编码错误的情况,在配置文件里设置统一字符集过滤器能够有效预防此类现象发生。通常是在 web.xml 文件加入如下片段即可生效: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` ### 示例代码展示 下面是一个综合性的例子展示了不同种类参数是如何被处理的: ```java @Controller @RequestMapping("/example") public class ExampleController { // 基础数据类型 @RequestMapping(value="/add", method=RequestMethod.GET) public ModelAndView addNumbers(int num1, double num2){ ... } // 实体对象 @RequestMapping(value="/createUser", method=RequestMethod.POST) public String createUser(User user){ ... } // List 集合 @RequestMapping(value="/processLists", method=RequestMethod.POST) public void processLists(List<String> items){ ... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值