不可見字元的坑
問題
不知道使用者從哪裡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控制字元(不可見字元)和可列印字元(可見字元), 以後碰到類似問題就很敏感了。
編寫一個函式escape(s,t),將字串t複製到字串s中,並在複製過程中將換行符、製表符等不可見字元分別轉換為\n、\t等相應的可見的轉義字元序列。要求使用switch語句。
#include <stdio.h> #include <ctype.h> #include <malloc.h> char *unescape(char s[], char t[]); char *escape(char s[], ch
又是檔案中的不可見字元問題
不久前, 需要在配置檔案中增加一項配置, 把預設的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 中引入了不可見字段思想。在之前的版本中