1. 程式人生 > >不可見字元的坑

不可見字元的坑

問題

不知道使用者從哪裡copy來的不可見字元,通過前端表單傳給後端儲存在資料庫中,使用者再次檢視該資料時,前端無法解析後端返回的json字串,後來通過資料庫發現該資料中間出現了一個換行符號/u2028,帶有這個字元的json通過js是不能解析的。這個字元屬於不可見字元,很難發現。

常見不可見字元

Unicode 字元值 轉義序列 含義 類別
\u0008 \b Backspace
\u0009 \t Tab 空白
\u000A \n 換行符(換行) 行結束符
\u000B \v 垂直製表符 空白
\u000C \f 換頁 空白
\u000D \r 回車 行結束符
\u0022 \” 雙引號 (“)
\u0027 \’ 單引號 (‘)
\u005C \ 反斜槓 ( \ )
\u00A0 不間斷空格 空白
\u2028 行分隔符 行結束符
\u2029 段落分隔符 行結束符
\uFEFF 位元組順序標記 空白

解決方案

在過濾器中使用包裝類替換request。程式碼如下

過濾器,這裡通過註解的方式向SpringMVC註冊過濾器。

@Slf4j
@WebFilter
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SpecialCharacterFilter implements
Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("SpecialCharacterFilter-------------------------初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 使用包裝類替換request chain.doFilter(new SpecialCharacterRequestWrapper((HttpServletRequest) request), response); } @Override public void destroy() { log.info("SpecialCharacterFilter-------------------------銷燬"); } }

Request包裝類,通過包裝request的方法,攔截獲取引數的方法,替換特殊字元。該方法對於@RequestBody接收的引數不支援,需要攔截getInputStream方法。

public class SpecialCharacterRequestWrapper extends HttpServletRequestWrapper {

	/**
	 * Constructs a request object wrapping the given request.
	 *
	 * @param request The request to wrap
	 * @throws IllegalArgumentException if the request is null
	 */
	public SpecialCharacterRequestWrapper(HttpServletRequest request) {
		super(request);
	}

	@Override
	public String getParameter(String name) {
		return replaceSpecialCharacter(super.getParameter(name));
	}

	@Override
	public String[] getParameterValues(String name) {
		return replaceSpecialCharacter(super.getParameterValues(name));
	}

	@Override
	public Map<String, String[]> getParameterMap() {
		Map<String, String[]> oldParams = super.getParameterMap();
		Map<String, String[]> newParams = new HashMap<>(oldParams.size());
		oldParams.forEach((k, v) -> newParams.put(k, replaceSpecialCharacter(v)));
		return oldParams;
	}

	/**
	 * 替換指定特殊字元
	 *
	 * @param oldStr 舊字串
	 * @return 新字串
	 */
	private String replaceSpecialCharacter(String oldStr) {
		return oldStr == null ? null : oldStr.replace("cnm", "***");
	}

	/**
	 * 替換指定特殊字元
	 *
	 * @param oldStr 舊字串
	 * @return 新字串
	 */
	private String[] replaceSpecialCharacter(String[] oldStr) {
		if (oldStr == null) {
			return null;
		}
		for (int i = 0, length = oldStr.length; i < length; i++) {
			oldStr[i] = replaceSpecialCharacter(oldStr[i]);
		}
		return oldStr;
	}
}

測試,兩個測試方法,一個接收指定引數,一個接收全部引數。

@RestController
@SpringBootApplication
public class Application {

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

	/**
	 * 訪問 http://localhost:8080/test1?msg=cnm
	 * 輸出 ***
	 */
	@RequestMapping("/test1")
	public String test1(String msg) {
		return msg;
	}
	
	/**
	 * 訪問 http://localhost:8080/test2?msg=cnm
	 * 輸出 {"msg":"***"}
	 */
	@RequestMapping("/test2")
	public Map test2(@RequestParam Map map) {
		return map;
	}
}

相關推薦

記錄一個——可見字元

對於訓練神經網路,不可避免的就是要用python處理資料集,前幾天做了一個索引的.txt檔案,來索引資料集。發現提示說沒有此檔案的路徑 No such file or directoryr traceback): /home/zhouyuan/SIGGRAPH18SSS-master/DYCE_

可見字元

問題 不知道使用者從哪裡copy來的不可見字元,通過前端表單傳給後端儲存在資料庫中,使用者再次檢視該資料時,前端無法解析後端返回的json字串,後來通過資料庫發現該資料中間出現了一個換行符號/u2028,帶有這個字元的json通過js是不能解析的。這個字元屬於不

爹的可見字元

用Python socket方式和合作方通訊,今天發現解碼解壓縮後都正常,就是在解析最終的XML字串的時候作死的報錯 SAXParseException('not well-formed (invalid token)',) 一直以為是編碼或字符集問題 最後通過種種努力

sql server 可見字元處理 總結

原文出處:https://www.cnblogs.com/zzry/p/5729404.html 前言 問題描述:在表列裡有肉眼不可見字元,導致一些更新或插入失敗。 幾年前第一次碰見這種問題是在讀取考勤機人員資訊時碰見的,折騰了一點時間,現在又碰到了還有點新發現就順便一起記錄下。 &nb

Vim中顯示可見字元

在Linux中,cat -A file可以把檔案中的所有可見的和不可見的字元都顯示出來,在Vim中,如何將不可見字元也顯示出來呢?當然,如果只是想在Vim中檢視的話,可以這樣:%!cat -A在Vim中呼叫cat轉換顯示。這樣的做法不便於編輯,其實Vim本身是可以設定顯示不可

Linux終端:用cat命令檢視可見字元

時常,某個程式或軟體並沒有語法錯誤,並且你檢查它的相關內容也確實沒有發現問題。這是因為你用普通文字編輯器軟體來檢視的時候,有許多字元沒有顯示出來,但在終端使用 cat 命令可以很容易地檢測出是否存在這些字元。 首先,我們建立一個簡單的文字檔案,寫入一些特殊字元。開啟終端,執行命令: printf 'test

Unicode可見字元的顯示

Unicode的學名是”Universal Multiple-Octet Coded Character Set”,簡稱為UCS 不可見字元”/u200b”為 Unicode Character ‘ZERO WIDTH SPACE’ (U+200B),可用於

hive 資料倉庫過濾 非法字元可見字元,亂碼

接收到伺服器端傳回來的資料以後,入到了hive表當中,發現一些url 的傳參是亂碼的。這時候,需要進行過濾。 例如: select uri from table limit 10;   在ascii 碼錶中,可見字元的範圍是:32~126  

可見字元&可見字元

國際上普遍採用ASCII編碼(American Standard Code for Information Interchange,美國資訊交換標準程式碼)作為通用的字元編碼。  在ASCII碼錶中,算上空格, 從32到126共95個是

ascii控制字元可見字元)和可列印字元可見字元)------浪費15分鐘的一次經歷

       系統工作得好好的, 但某次卻異常, 花了十多分鐘, 才定位出是載入檔案中包含了不可見字元導致的。 最後解決方法是: 增強系統的相容性。        今天我們來聊聊ascii控制字元(不可見字元)和可列印字元(可見字元), 以後碰到類似問題就很敏感了。

又是檔案中的可見字元問題

      不久前, 需要在配置檔案中增加一項配置, 把預設的error級別的日誌開關換為debug級別的日誌開關, 於是就增加了該項。       然後, 這並沒有起到卵用, 明明是加這個配置啊, 明明是這個值啊, 為什麼不生效呢? 難道系統讀的不是這個配置檔案? 正納悶

C++字串剔除首尾可見字元

void Trim(string &str) { TrimLeft(str); TrimRight(str); } void TrimLeft(string &str) { if (str.empty()) { return; } st

查找出db中可見字元

refshttps://stackoverflow.com/questions/8655909/whats-the-best-way-to-identify-hidden-characters-in-the-result-of-a-query-in-sq原理先生成一個不可見字

oracle中的可見字元

今天做統計的時候發現一個數據表面上看來是‘920 ’但去空格無亂如何都去不掉,最後發現是不可見字元。。。 於是在網上搜到一篇文章,如何來判斷這個不可見字元的問題~ 按下面的方法判斷出不可見字元的ascII碼是10,於是用rtrim('原字元','chr(10)')來去掉這個不

練習 3-2 編寫一個函式escape(s, t),將字串t 複製到字串s 中,並在複製過程中將換行符、製表符等可見字元分別轉換為\n、\t等相應的可見的轉義字元序列。要求使用swich語句。

要將所有的轉義字元都進行轉換,分支會有很多,在這裡以換行符和製表符為例進行轉換。 #include<stdio.h> void escape(char s[],char t[]); vo

行走在陽光下的那些可見字元

行走在陽光下的那些不可見字元 假設我們已經知道Unicode字符集,如果不清楚也可閱讀本文,然後等待下一篇主要介紹Unicode的文章。   背景   今天我們主要來聊聊這些行走在陽光下的不可見字元。不可見字元在電腦科學和通訊學中被稱為控制字元或非列印字元,是字符集中的一個碼位(cod

小程式填之路—input密碼可見可見(已解決)

2018年11月5日下午16:45修改: 經過在手機上多次真機測試,發現這個方法有問題,在電腦上沒什麼毛病。但在手機上,會出現點選眼睛的小圖示不能夠及時顯示或者隱藏密碼,特此對程式碼進行簡化和修改。 <!--修改wxml--> <image class='showIm

關於fastjson序列化可見特殊字元存在的bug

相關博文連結:http://i.dotidea.cn/2014/08/fastjson-serialize-overflow/ 連結摘自某位大神,自己做個備忘 fastjson 1.1.39版本以下(

oracle 12c 新特性之可見字段

創建 oracl alt created 顯式 11g 不可見 插入數據 esc 在Oracle 11g R1中,Oracle以不可見索引和虛擬字段的形式引入了一些不錯的增強特性。繼承前者並發揚光大,Oracle 12c 中引入了不可見字段思想。在之前的版本中