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 大汉 * */ ...
随机推荐
- ipython快捷键
IPython Notebook有两种不同的键盘输入模式(编辑模式和命令模式). 编辑模式:允许你输入代码或者文本到一个单元格(cell这里我译作单元格)内,并且单元格外面有灰色的选中框(注:Jupy ...
- [leetcode]450. Delete Node in a BST二叉搜索树删除节点
二叉树变量只是一个地址 public static void main(String[] args) { TreeNode t = new TreeNode(3); help(t); System.o ...
- std::thread线程详解(1)
目录 目录 简介 线程的使用 线程的创建 线程的方法和属性 std::jthread (C++20) stop_token (C++20) 总结 Ref 简介 本文主要介绍了标准库中的线程部分.线程是 ...
- 一台PC端安装多店仓信息的删除
如图所示,安装了多店仓,想要删除其中莫一店仓信息! 步骤一:先找到对应目录,一般默认的目录为C:\Users\xxxx\AppData\Roaming\WebPos2.0\bosnatweiniman ...
- 线程安全问题synchronized锁
1.线程安全问题的原因 因为 Java 中对静态变量的自增,自减并不是原子操作,要彻底理解,必须从字节码来进行分析 例如对于 i++ 而言(i 为静态变量),实际会产生如下的 JVM 字节码指令: ...
- android 百度地图 团队开发及正式apk发布
百度地图开发关键是获取正确的API Key, 百度官网写的只是在你本地的机器能运行 你把AndroidManifest.xml(这里是最新的v2_4_1,API Key配置在这里) svn 提交后 ...
- ASP.NET 上传文件到共享文件夹
创建共享文件夹参考资料:https://www.cnblogs.com/dansediao/p/5712657.html 上传文件代码 web.config <!--上传文件配置,UploadP ...
- 解决surfacebook无法运行64位虚拟机的问题
如果您嫌烦请直接看英文部分解决方案,另外windows专业版内置的hyper-v也是一款及其好用的虚拟机. 网上各种方案都尝试过,但是每次使用VMware创建64为虚拟机的时候总会显示不支持64位虚拟 ...
- Zap简单使用
前言 zap 是 uber 开源的一个日志记录的包, uber 在 go 的领域建树颇多, zap 更是优秀, 相比于自带的 log ,他有更多的功能, 当然, 最显眼的还是他很快, 本文介绍 zap ...
- linux之curl工具
curl是一个利用URL语法在命令行下工作的文件传输工具,作用是发出网络请求,然后获取数据:它支持文件的上传和下载:支持多种通信协议. 一.查看网页源码 直接在 curl 命令后加上网址,默认会发送 ...