Spring Filter过滤表单中的非法字符
使用Spring Filter过滤表单中的非法字符
1 package test.filter;
2
3 import java.io.IOException;
4 import java.util.Iterator;
5 import java.util.Map;
6
7 import javax.servlet.FilterChain;
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletRequestWrapper;
11 import javax.servlet.http.HttpServletResponse;
12
13 import org.springframework.beans.BeanWrapper;
14 import org.springframework.beans.BeansException;
15 import org.springframework.web.filter.OncePerRequestFilter;
16 import org.springframework.web.multipart.MultipartHttpServletRequest;
17 import org.springframework.web.multipart.commons.CommonsMultipartResolver;
18
19 /**
20 * 使用Spring过滤器来过滤请求中的非法字符<br>
21 * 如果请求被重定向,则在被重定向的控制器方法执行前此过滤器也会执行
22 * @author admin
23 *
24 */
25 public class CharacterFilter extends OncePerRequestFilter {
26
27 // 如果使用CommonsMultipartResolver处理文件上传,并且表单类型为multipart/form-data
28 // 则此处需使用CommonsMultipartResolver,其参数设置应与配置文件中保持一致
29 private CommonsMultipartResolver multipartResolver = null;
30
31 /**
32 * 过滤器加载时,initBeanWrapper(BeanWrapper)方法会在initFilterBean()方法之前加载<br>
33 * 可以通过super.getFilterConfig().getInitParameter("param1")方法获取在web.xml中配置的init-param参数
34 */
35 @Override
36 protected void initBeanWrapper(BeanWrapper bw) throws BeansException {
37 String param1 = super.getFilterConfig().getInitParameter("param1");
38 System.out.println("param1:" + param1);
39
40 super.initBeanWrapper(bw);
41 }
42
43 @Override
44 protected void initFilterBean() throws ServletException {
45 multipartResolver = new CommonsMultipartResolver();
46 multipartResolver.setMaxInMemorySize(104857600);
47 multipartResolver.setDefaultEncoding("utf-8");
48
49 super.initFilterBean();
50 }
51
52 @Override
53 protected void doFilterInternal(HttpServletRequest request,
54 HttpServletResponse response, FilterChain filterChain)
55 throws ServletException, IOException {
56 //此处可通过配置参数判断是否需要过滤 ...
57
58 HttpServletRequest httpRequest = (HttpServletRequest)request;
59 // 此处使用httpRequest,直接使用request可能造成CharacterFilterRequestWrapper中request获取不到值
60 if(httpRequest.getContentType().toLowerCase().contains("multipart/form-data")){
61 MultipartHttpServletRequest resolveMultipart = multipartResolver.resolveMultipart(httpRequest);
62 filterChain.doFilter(new CharacterFilterRequestWrapper(resolveMultipart), response);
63 }else{
64 filterChain.doFilter(new CharacterFilterRequestWrapper(httpRequest), response);
65 }
66
67 }
68
69 class CharacterFilterRequestWrapper extends HttpServletRequestWrapper {
70
71 public CharacterFilterRequestWrapper(HttpServletRequest request) {
72 super(request);
73 }
74
75 @Override
76 public String getParameter(String name) {
77 return super.getParameter(name);
78 }
79
80 @Override
81 public String[] getParameterValues(String name) {
82 return filterString(super.getParameterValues(name));
83 }
84
85 @Override
86 public Map<String, String[]> getParameterMap() {
87 Map<String, String[]> map = super.getParameterMap();
88 if(map == null){
89 return null;
90 }
91
92 Iterator<String> it = map.keySet().iterator();
93 while(it.hasNext()){
94 String param = it.next();
95 String[] value = map.get(param);
96 map.put(param, filterString(value));
97 }
98
99 return map;
100 }
101
102 private String filterString(String value){
103 if(value == null){
104 return null;
105 }
106
107 // 此处可根据需要选择需要过滤的字符
108 value = value.replaceAll("\r\n", "");
109 value = value.replaceAll("\t", " ");
110 value = value.replaceAll(">", ">");
111 value = value.replaceAll("<", "<");
112 value = value.replaceAll("\"", """);
113
114 return value;
115 }
116
117 private String[] filterString(String[] values){
118 if(values == null){
119 return null;
120 }
121
122 for (int i = 0; i < values.length; i++) {
123 values[i] = filterString(values[i]);
124 }
125
126 return values;
127 }
128
129 }
130
131 }
Spring Filter过滤表单中的非法字符的更多相关文章
- C#创建目录,文件名过滤特殊字符串,非法字符
string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()) ...
- Filter过滤非法字符
示例:定义一个Filter,用于用户发言中出现的“晕”字,即如果没有这个字则允许发言,如果有这个字则不允许发言并提示错误. CharForm.jsp <%@ page language=&quo ...
- JS验证表单中TEXT文本框中是否含有非法字符
<form id="form" action="" method="post"> <input type="hi ...
- 使用Filter过滤非法内容
1.首先,需要编写一个响应的封装器ResponseReplaceWrapper,用它来缓存response中的内容,代码如下: ResponseReplaceWrapper.java package ...
- Java Filter过滤xss注入非法参数的方法
http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...
- java 非法字符过滤 , 半角/全角替换
java 非法字符过滤 , 半角/全角替换 package mjorcen.netty.test1; import java.io.UnsupportedEncodingException; publ ...
- windows文件名非法字符过滤检测-正则表达式
过滤文件名非法字符 windows现在已知的文件名非法字符有 \ / : * ? " < > | var reg = new RegExp('[\\\\/:*?\"&l ...
- spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)
一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...
- Java正则表达式过滤并消除非法字符
package sd; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author 大汉 * */ ...
随机推荐
- Maven安装配置和IDEA创建Maven项目
maven 一个项目架构管理工具(约定大于配置) 1.配置 M2_HOME:指向maven bin目录 以后bootstrop要用 MAVEN_HOME:指向maven目录 path:指向maven ...
- 如何解决Visual Studio 首次调试 docker 的 vs2017u5 exists, deleting Opening stream failed, trying again with proxy settings
前言 因为之前我电脑安装的是windows10家庭版,然而windows10家庭没有Hyper-v功能. 搜索了几篇windows10家庭版安装docker相关的博客,了解一些前辈们走过的坑. 很多人 ...
- 使用docker制作Mysql镜像
一.过程说明 通过Dockerfile创建mysql镜像,使用的mysql软件包为mariadb二进制分发版,最终在宿主机启动mysql容器从而能在mysql容器外部访问mysql服务. 宿主机IP ...
- CentOS 7 网卡注释
TYPE=Ethernet # 网络类型为:EthernetPROXY_METHOD=none # 代理方式:关闭状态BROWSER_ONLY=no # 只是浏览器:否BOOTPROTO=static ...
- 【函数分享】每日PHP函数分享(2021-1-12)
str_pad() 使用另一个字符串填充字符串为指定长度 . string str_pad ( string $input, int $pad_length[, string $pad_string= ...
- 基于nginx实现web服务器的双机热备
1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...
- PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索
题目分析: 一共有N个编号为1~1000的人,以及一共有编号为1~1000种不同的兴趣,在题目给出1~N编号的人员每个人喜欢的兴趣的id后,要求统计出不同的人员集合的个数以及每个人员几个的人数从大到小 ...
- 到底什么是哈希Hash?
有次面试被问到这个问题? 我说是经过运算的一串字符串,这个回答显然是让人不满意,连自己都不满意! 但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统 ...
- 如何实现微信小程序动画?添加到我的小程序动画实现详细讲解,轻松学会动画开发!附壁纸小程序源码下载链接
为了让用户能尽可能多地使用小程序,也算是沉淀用户,现在很多小程序中,都有引导用户"添加到我的小程序"的操作提示,而且大多都是有动画效果.在高清壁纸推荐小程序首页,用户每次进入,都会 ...
- 与图论的邂逅07:K短路
在做最短路的题时我们不免会碰到许多求次短路的题,然而我们也能很快地想到解决的办法: 用dijkstra跑一遍最短路,当终点第二次被取出时就是次短路了.时间复杂度为O((N+M)logN).实际上前面得 ...