首先在sprigMvc的配置文件中配置返回结果集使用的类

<!-- 参数转码 -->
<mvc:annotation-driven>
<!-- 注册处理 JSON 的转换器 register-defaults="true" -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
<property name="writeAcceptCharset" value="false" />
</bean>
<bean class="com.util.json.JsonConverter">
<property name="supportedMediaTypes">
<list>
<!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

由于现有工程使用的是json对象结果集,所以只对json格式的参数进行转义

然后在自己工程里配置一个JSON返回结果集的参数转换类

package com.util.json;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject; import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; /**
* JSON格式返回参数转换类
* <功能详细描述>
*
* @author songxiaotong
* @version [版本号, 2016年10月14日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class JsonConverter extends FastJsonHttpMessageConverter
{
/**
* 日志记录器
**/
private static final Logger LOGGER = LogManager.getLogger(JsonConverter.class); /**
* 重写writeInternal方法,在返回内容前首先进行HTML字符转义
* <功能详细描述>
* @param object
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
* @see [类、类#方法、类#成员]
*/
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException
{
// 获取输出流
OutputStream out = outputMessage.getBody(); // 获取要输出的文本
String text = JSON.toJSONString(object, super.getFeatures()); // 对文本做HTML特殊字符转义
String result = convertJson(text); // 输出转义后的文本
out.write(result.getBytes(super.getCharset()));
} /**
* JSON参数转义
* <功能详细描述>
* @param json
* @return
* @see [类、类#方法、类#成员]
*/
private String convertJson(String json)
{
try
{
// 判断是否是JSON对象
if (json.startsWith("{"))
{
// 将参数转换成JSONObject
JSONObject jsonObj = JSONObject.fromObject(json);
// 处理参数
JSONObject myobj = jsonObj(jsonObj);
return myobj.toString();
}
// 判断是否是JSON数组
else if (json.startsWith("["))
{
// 将参数转换成JSONArray
JSONArray jsonArray = JSONArray.fromObject(json);
//处理参数
JSONArray array = parseArray(jsonArray);
return array.toString();
}
else
{
return json;
}
}
catch (JSONException e)
{
LOGGER.error("Json数据解析处理失败!");
return "{}";
}
} /**
* JSON参数Map(对象)转义
* <功能详细描述>
* @param json
* @return
* @see [类、类#方法、类#成员]
*/
@SuppressWarnings("rawtypes")
private JSONObject jsonObj(JSONObject json)
{ for (Iterator iter = json.keys(); iter.hasNext();)
{
// 获取对象的key
String key = (String)iter.next();
// 获取对象的值
Object obj = json.get(key); // 判断对象类型
if (obj instanceof List)
{
json.put(key, parseArray((JSONArray)obj)); }
// 判断是否是对象结构
else if (obj instanceof Map)
{
// 处理参数
json.put(key, jsonObj((JSONObject)obj));
}
else if (obj instanceof String)
{
// 处理参数
json.put(key, convertStr((String)obj));
} }
return json;
} /**
* JSON参数List(数组)转义
* <功能详细描述>
* @param json
* @return
* @see [类、类#方法、类#成员]
*/
private JSONArray parseArray(JSONArray jsonArray)
{
// 判空
if (null == jsonArray || jsonArray.isEmpty() || jsonArray.size() == 0)
{
return jsonArray;
}
//
for (int i = 0, l = jsonArray.size(); i < l; i++)
{
Object obj = jsonArray.get(i); // 判断是否是数据结构
if (obj instanceof List)
{
// 处理数组对象
parseArray((JSONArray)obj);
}
// 判断是否是对象结构
else if (obj instanceof Map)
{
// 处理参数
jsonObj((JSONObject)obj);
}
// 判断是否是String结构
else if (obj instanceof String)
{
jsonArray.set(i, convertStr((String)obj));
}
} return jsonArray;
} /**
* HTML脚本转义
* <功能详细描述>
* @param str
* @return
* @see [类、类#方法、类#成员]
*/
private String convertStr(String str)
{
// TODO &、<、>、"、'、(、)、%、+、\
return str.replace("&", "&amp;")
.replace("<", "&lt;")
.replace(">", "&gt;")
.replace("\"", "&quot;")
.replace("'", "'")
.replace("(", "(")
.replace(")", ")")
.replace("%", "%")
.replace("+", "+")
.replace("\\", "\");
}
}

SpringMVC结果参数转换XSS攻击安全处理的更多相关文章

  1. XSS攻击解决办法 Spring mvc databinder

    XSS攻击解决办法 一.SpringMVC架构下@InitBinder方法 Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解, ...

  2. 360[警告]跨站脚本攻击漏洞/java web利用Filter防止XSS/Spring MVC防止XSS攻击

    就以这张图片作为开篇和问题引入吧 <options>问题解决办法请参考上一篇 如何获取360站长邀请码,360网站安全站长邀请码 首先360能够提供一个这样平台去检测还是不错的.但是当体检 ...

  3. XSS攻击过滤处理

    关于XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. XSS漏洞的危害 网络钓鱼,包括盗取各类用户账号: 窃取用户cooki ...

  4. 记一次JAVA WEB项目解决XSS攻击的办法(亲测有效)

    什么是XSS攻击 简单来说,XSS 攻击是页面被注入了恶意的代码,度娘一大堆的东西,不想说 系统架构主要是SSM框架,服务层另外使用了DubboX.   为啥说这个,因为SpringMVC对于Xss攻 ...

  5. XSS攻击防御篇

    前言   上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...

  6. SpringBoot防XSS攻击

    1 . pom中增加依赖 <!-- xss过滤组件 --> <dependency> <groupId>org.jsoup</groupId> < ...

  7. Spring Boot XSS 攻击过滤插件使用

    XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS ...

  8. 防御XSS攻击-encode用户输入内容的重要性

    一.开场先科普下XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶 ...

  9. 防止XSS攻击的方法

    什么是XSS? 使用Jsoup来防止XSS攻击 Jsoup官网 Jsoup中文 maven包引入 <dependency> <groupId>org.jsoup</gro ...

随机推荐

  1. show()和隐藏hide() slideDown()和 slideUp() fadeIn()和fadeOut()

    1==>显示show()和隐藏hide() 是一组动画 与切换toggle()$("div").show():当不传递参数时,没有动画效果,它将某个元素瞬间显示出来 $(&q ...

  2. c# WF 第4节 窗体的事件

    本节内容: 1:事件是什么? 2:窗体事件在哪可以找到 3:事件有哪些 1:事件是什么? 2:窗体事件在哪里 第一种: 第二种: 3:事件有哪些

  3. c# 第41节 异常处理

    本节内容: 1:捕获异常两种方式 2:处理异常的两种方式 3:实例处理异常 4:手动触发异常 5:预定义异常类有哪些 6:自定义异常 1:捕获异常 第一种 捕获:只能知道发生了异常 第二种捕获: 可以 ...

  4. [C1] Andrew Ng - AI For Everyone

    About this Course AI is not only for engineers. If you want your organization to become better at us ...

  5. DRF--介绍和安装

    前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高.这种应用模式比较适合纯网页应用,但是当后端对接 ...

  6. Paper | Dynamic Residual Dense Network for Image Denoising

    目录 1. 故事 2. 动机 3. 做法 3.1 DRDB 3.2 训练方法 4. 实验 发表于2019 Sensors.这篇文章的思想可能来源于2018 ECCV的SkipNet[11]. 没开源, ...

  7. bootstrap-editable 中关于onEditableSave 回调

    问题描述 在对bootstrap-editable 进行编辑时,有两种使用方法:一种直接在每一个column中进行编辑保存,例如:{ title:'标题', field:'title', width: ...

  8. Python爬取拉勾网招聘信息并写入Excel

    这个是我想爬取的链接:http://www.lagou.com/zhaopin/Python/?labelWords=label 页面显示如下: 在Chrome浏览器中审查元素,找到对应的链接: 然后 ...

  9. prisma反向代理

    概要 为什么要做 prisma 的反向代理 反向代理示例(by golang) prisma 服务 gateway 服务 整体流程 认证 反向代理 权限 总结 概要 接触 prisma 有段时间了, ...

  10. Qt+FFmpeg 简单实现视频播放

    这里使用 Qt + FFmpeg 实现了一个简单播放视频的例子.先看下按下按钮播放视频时的效果图: 完整工程下载链接:Github-FFmpeg_demo 注意:一定要将 bin 目录下的 dll 文 ...