首先在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. Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…

    Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳: 公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲 ...

  2. 4. Vue - 指令(Add)

    一.指令系统 1. v-text ​ v-text主要用来更新textContent,可以等同于JS的text属性. <span v-text="msg"></s ...

  3. vue项目关闭eslint校验

    [前言] eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格.这篇文章主要介绍了vue项目关闭eslint校验,需要的朋友可以参考下 [主体] 简介eslint esl ...

  4. 浅谈js的类数组对象arguments

    类数组对象:arguments总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的 ...

  5. Java实现记事本|IO流/GUI

    Java实现记事本 题目 利用GUI实现一个简单的记事本(notepad),即打开文件,文字内容显示在界面上: 允许对文字内容进行编辑,并可以保存到文件. 代码 package notePadExp; ...

  6. [C4W3] Convolutional Neural Networks - Object detection

    第三周 目标检测(Object detection) 目标定位(Object localization) 大家好,欢迎回来,这一周我们学习的主要内容是对象检测,它是计算机视觉领域中一个新兴的应用方向, ...

  7. git 推送本地项目到远程库

    git 推送本地项目到远程库 1@DESKTOP-3H9092J MINGW64 /e/mozq/00store/01/SmartCard_MS $ git init Initialized empt ...

  8. Mybatis日志(七)

    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志 ...

  9. React内容

    React Fiber   16版本 registerServiceWorker 的作用 PWA  progressive web application  写手机app应用   在断网的情况下,第二 ...

  10. java jvm虚拟机类加载器

    在Java中任意一个类都是由这个类本身和加载这个类的类加载器来确定这个类在JVM中的唯一性. 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到J ...