首先在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. 判断101-200之间有多少个素数,并输出所有素数,方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。

    <?php$sum=0;for($i=101;$i<=200;$i++){    for($j=2;$j<=sqrt($i);$j++)    {       if($i%$j==0 ...

  2. Django 模版语言

    传入变量 {{ 变量名 }} 在 view.py 的函数返回 render 时在html文件名后传入一个字典,字典的 key 对应html文件中的变量名,value 为传入的值 views.py: d ...

  3. Django cache (缓存)

    五种配置 1.开发调试 # 此为开始调试用,实际内部不做任何操作 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backend ...

  4. Moving x86 assembly to 64-bit (x86-64)

    While 64-bit x86 processors have now been on the market for more than 5 years, software support is o ...

  5. hasattr、getattr、setattr、delattr、反射

    目录 hasattr getattr setattr delattr 反射的应用 __import__(了解) 思考: 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对 ...

  6. pindel及breandancer安装

    1.安装pindel需要依赖htslib https://github.com/samtools/htslib.git mv htslib htslib1 autoheader # If using ...

  7. Luogu P5416 [CTSC2016]时空旅行

    第一次写线段树分治的题目,没想到是道这么毒的题233 首先发现题目里的\((x,y,z,c)\)就是在放屁,只有\((x,c)\)是有用的 因此我们可以把题意转化为,在某一个时间节点上,求出所有元素的 ...

  8. 游戏设计艺术 第2版 (Jesse Schell 著)

    第1章 太初之时,有设计师 (已看) 第2章 设计师创造体验 第3章 体验发生于场景 第4章 体验从游戏中诞生 第5章 游戏由元素构成 第6章 元素支撑起主题 第7章 游戏始于一个创意 第8章 游戏通 ...

  9. ZooKeeper 入门看这篇就够了

    什么是 ZooKeeper? ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务.ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原 ...

  10. DGCNN

    架构总览 模型的整体架构源于 WebQA 的参考论文 Dataset and Neural Recurrent Sequence Labeling Model for Open-Domain Fact ...