使用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(">", "&gt;");
111 value = value.replaceAll("<", "&lt;");
112 value = value.replaceAll("\"", "&quot;");
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过滤表单中的非法字符的更多相关文章

  1. C#创建目录,文件名过滤特殊字符串,非法字符

    string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()) ...

  2. Filter过滤非法字符

    示例:定义一个Filter,用于用户发言中出现的“晕”字,即如果没有这个字则允许发言,如果有这个字则不允许发言并提示错误. CharForm.jsp <%@ page language=&quo ...

  3. JS验证表单中TEXT文本框中是否含有非法字符

    <form id="form" action="" method="post"> <input type="hi ...

  4. 使用Filter过滤非法内容

    1.首先,需要编写一个响应的封装器ResponseReplaceWrapper,用它来缓存response中的内容,代码如下: ResponseReplaceWrapper.java package ...

  5. Java Filter过滤xss注入非法参数的方法

    http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...

  6. java 非法字符过滤 , 半角/全角替换

    java 非法字符过滤 , 半角/全角替换 package mjorcen.netty.test1; import java.io.UnsupportedEncodingException; publ ...

  7. windows文件名非法字符过滤检测-正则表达式

    过滤文件名非法字符 windows现在已知的文件名非法字符有 \ / : * ? " < > | var reg = new RegExp('[\\\\/:*?\"&l ...

  8. spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)

    一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...

  9. Java正则表达式过滤并消除非法字符

    package sd; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author 大汉 * */ ...

随机推荐

  1. [leetcode]75.Sort Color三指针

    import java.util.Arrays; /** * Given an array with n objects colored red,white or blue, * sort them ...

  2. stm32之can总线过滤器研究

    stm32的can总线的配置如下:       CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式      CAN_InitStructure.CAN_A ...

  3. informix部署安装

    informix部署安装 一.环境准备 Linux版本:centos7.6 Linux主机名:localhost informix安装包:ibm.ids.14.10.FC4W1.LNX.tar inf ...

  4. CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考

    CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性  可用性   分区容错性] BASE理论是对CAP中 ...

  5. Thread.yeild方法详解

    从原理上讲其实Thread.yeild方法其实只是给线程调度机制一个暗示:我的任务处理的差不多了,可以让给相同优先级的线程CPU资源了:不过确实只是一个暗示,没有任何机制保证它的建议将被采纳: 看一个 ...

  6. 关于Maven项目pom.xml文件不报错却有红叉的问题

    原因:spring-boot,升级到2.1.5版本,而maven-jar-plugin.version插件默认版本不兼容所以报错,但不影响运行 解决:在<properties></p ...

  7. vue项目中使用日期获取今日,昨日,上周,下周,上个月,下个月的数据

    今日公司项目接口要求获取动态的上周数据,经过不断的寻找,找到此方法. 该方法使用的是Moment.js JavaScript日期处理类库 一:安装依赖 npm install moment --sav ...

  8. Jetbrains系列产品重置试用方法

    0x0. 项目背景 Jetbrains家的产品有一个很良心的地方,他会允许你试用30天(这个数字写死在代码里了)以评估是否你真的需要为它而付费.但很多时候会出现一种情况:IDE并不能按照我们实际的试用 ...

  9. 醒醒!Python已经支持中文变量名啦!

    最近,我在翻阅两本比较新的 Python 书籍时,发现它们都犯了一个严重的低级错误! 这两本书分别是<Python编程:从入门到实践>和<父与子的编程之旅>,它们都是畅销书,都 ...

  10. 【Git】4、创建代码仓库,HTTP、SSH拉取远端代码

    拉取远端代码:使用Git命令下载远程仓库到本地 文章目录 拉取远端代码:使用Git命令下载远程仓库到本地 1.创建远程代码仓库 2.创建仓库 3.进入仓库 4.HTTP(S)获取远程仓库 首次拉取 更 ...