使用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. 在开发板上显示英文字符和汉字--tiny6410

    程序字符需要改成gb2312.否则无法正常显示中文字符. main.c代码: #include <sys/types.h> #include <sys/stat.h> #inc ...

  2. JavaScript内置可用类型

    string,number,boolean,null和undefined,object,symbol(ES6新语法)

  3. python实现贴吧顶贴机器人

    前言------百度贴吧流量如何?全球最大的中文社区,虽然比不上阿里,腾讯! 此文章仅供交流学习.建议机器人用小号操作,切勿用作商业用途! 测试版本:python 3.7 64位火狐浏览器firefo ...

  4. JAVA静态代理和动态代理理解

    代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客可以直接从厂家购买产品,但 ...

  5. JS中的多层次排序算法

    引子 排序在编程中随处可见,从开始学习变成,到项目开发,基本上或多或少会遇到一些排序问题,接下来我要写的是我在实际开发终于到的一个排序问题,一开始卡了我很久,后面随着知识积累,实践变多才解决掉了,不知 ...

  6. 2021升级版微服务教程—为什么会有微服务?什么是SpringCloud?

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  7. Tomca7t服务器 配置HTTP和HTTPS 同时访问

    (首先你要有 ssl 证书 ,我是阿里的 ) 查看申请ssl证书(https://www.cnblogs.com/lxf-mw/p/14261303.html) 一.下载 tomcat证书(两个文件) ...

  8. react项目中实现搜索关键字呈现高亮状态(一)

    最近有个需求,在一个react项目中,实现搜索关键字呈现高亮状态.这个在普通的html文件中还好操作些,在react项目中有点懵逼了,因为react项目中很少操作dom,有点无从下手.但最后还是实现了 ...

  9. 【转载】一种git commit前自动格式化的方式

    查看原文 简介 这个系列为了解决一个问题:自动化的去管理代码风格和格式 前提:Linux,C语言,Clang 如何在每次commit的时候,将代码风格自动格式化后再提交commit,且格式化的内容必须 ...

  10. mysql修改sql_mode为宽松模式

    sql_mode ANSI TRADITIONAL STRICT_TRANS_TABLES sql_mode为空 最宽松的模式, 即使有错误既不会报错也不会有警告️ ANSI 宽松模式,对插入数据进行 ...