使用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]231. Power of Two判断是不是2\3\4的幂

    /* 用位操作,乘2相当于左移1位,所以2的幂只有最高位是1 所以问题就是判断你是不是只有最高位是1,怎判断呢 这些数-1后形成的数,除了最高位,后边都是1,如果n&n-1就可以判断了 如果是 ...

  2. [LeetCode]172. Factorial Trailing Zeroes阶乘尾随0的个数

    所有的0都是有2和45相乘得'到的,而在1-n中,2的个数是比5多的,所以找5的个数就行 但是不要忘了25中包含两个5,125中包含3个5,以此类推 所以在找完1-n中先找5,再找25,再找125.. ...

  3. [leetcode]207. Course Schedule课程表

    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...

  4. [LeetCode]9. Palindrome Number判断回文数字

    /* 查看网上的思路有两种: 1.每次取两边的数,然后进行比较 2.取数的倒置数,进行比较 */ public boolean isPalindrome1(int x) { if (x<0) r ...

  5. CentOs 7 安装mysql5.7.18(二进制版本)

    1.下载二进制版本安装包.搜狐开源镜像站:http://mirrors.sohu.com/mysql/MySQL-5.7/   , 找 mysql-5.7.18-linux-glibc2.5-x86_ ...

  6. 初识分布式图数据库 Nebula Graph 2.0 Query Engine

    摘要:本文主要介绍 Query 层的整体结构,并通过一条 nGQL 语句来介绍其通过 Query 层的四个主要模块的流程. 一.概述 分布式图数据库 Nebula Graph 2.0 版本相比 1.0 ...

  7. linux下 shell时间处理

    一.hour #获取当前时间年月日时分秒current_create_time=`date +"%Y-%m-%d %H:%M:%S"` echo $current_create_t ...

  8. Solon rpc 之 SocketD 协议

    1. 简介 SocketD 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议.旨在用于分布式应用程序中.从这个意义上讲,SocketD可以是RSocket等其他类似协议的替代方案.它的消息协 ...

  9. 洛谷P1055 字符串的处理-----ISBN

    题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字.11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位 ...

  10. Linux设置系统时区

    https://www.xlsys.cn/1741.html 如果你的 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区.NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量, ...