问题
不知道用户从哪里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