springMVC修改用户请求内容
最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容。
request这个方法里,有getParameter(String name)、getParameterValues(String name)、getParameterNames()以及getParameterMap()是可以获得参数键值对的,Servlet自带的HttpServletRequest的方法是不支持修改用户请求类型的,我也尝试过直接去修改,都以异常收尾,后面我想到HttpServletRequest既然是一个接口,那我去实现它,然后直接用我们实现的类传到filterChain.doFilter(servletRequest, servletResponse)里面不也可以么,可是要实现的方法也太多了,好在ServletApi提供了一个class HttpServletRequestWrapper封装了这些方法,我们可以通过extends这个类,然后重写一些重要的方法来修改用户的请求,下面就开始我们的改造吧。
1.新建一个Filter,我给这个类命名为RequestFilter
public class RequestFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
2.新建一个类,通过继承HttpServletRequestWrapper来实现request的作用。
class RequestWrapper extends HttpServletRequestWrapper {
}
3.新建一个private属性:private Map<String, String[]> paramMap;用这个paramMap来存储用户请求的内容,并且在构造方法中初始化paramMap,初始化的方法为
paramMap = new HashMap<>();//定义
paramMap.putAll(request.getParameterMap());//初始化
4.重写上面提到的四个方法,
@Override
public String getParameter(String name) {
String[] values = paramMap.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
} @Override
public String[] getParameterValues(String name) {
return paramMap.get(name);
} @Override
public Enumeration<String> getParameterNames() {
return new Enumeration<String>() {
private Iterator<String> iterator = paramMap.keySet().iterator(); @Override
public boolean hasMoreElements() {
return iterator.hasNext();
} @Override
public String nextElement() {
return iterator.next();
}
};
} @Override
public Map<String, String[]> getParameterMap() {
return paramMap;
}
5.通过以上这些操作,我们就可以实现对用户请求进行修改。
public class RequestFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
RequestWrapper requestWrapper = new RequestWrapper(request);
if (request.getMethod().equals("POST")) {
logger.debug("开始过滤请求中的表情字符");
requestWrapper.emojiFilter();
}
filterChain.doFilter(requestWrapper, servletResponse);
}
@Override
public void destroy() {
}
class RequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> paramMap;
RequestWrapper(HttpServletRequest request) {
super(request);
paramMap = new HashMap<>();
paramMap.putAll(request.getParameterMap());
}
@Override
public String getParameter(String name) {
String[] values = paramMap.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
@Override
public String[] getParameterValues(String name) {
return paramMap.get(name);
}
@Override
public Enumeration<String> getParameterNames() {
return new Enumeration<String>() {
private Iterator<String> iterator = paramMap.keySet().iterator();
@Override
public boolean hasMoreElements() {
return iterator.hasNext();
}
@Override
public String nextElement() {
return iterator.next();
}
};
}
@Override
public Map<String, String[]> getParameterMap() {
return paramMap;
}
private void resetParamMap(String key, String[] value) {
paramMap.put(key, value);
}
//过滤表情
void emojiFilter() {
for (String key : paramMap.keySet()) {
String[] valueSet = paramMap.get(key);
if (BeanUtil.nonNull(valueSet) && valueSet.length > 0) {
logger.debug("过滤前:" + valueSet[0]);
valueSet[0] = EmojiFilter.filterEmoji(valueSet[0]);
logger.debug("过滤后:" + valueSet[0]);
resetParamMap(key, valueSet);
}
}
}
}
}
springMVC修改用户请求内容的更多相关文章
- Charles系列三:Charles打断点(包含修改请求,修改返回的内容),模拟慢速网络(弱网测试),域名映射,过滤请求,接口调试,打压测试
一:Charles断点的使用(包含修改请求,修改返回的数据) 设置断点来修改请求和返回的数据,在开发过程中可以模拟多种响应.步骤如下: 1.添加断点方法有两种: 方法1:找到Charles中菜单项Pr ...
- springMVC一个Controller处理所有用户请求的并发问题(转)
springMVC一个Controller处理所有用户请求的并发问题 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.一 ...
- 使用 openresty 修改请求内容
1. 目的 动态修改 html 页面内容 2. 使用方式 openresty 在 header_filter 阶段 以及body_filter 阶段进行数据修改 3. 源码 此 ...
- IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求
http://www.cnblogs.com/JKqingxinfeng/archive/2012/10/29/2744663.html HTTP错误404.13 - Not Found 请求筛选模块 ...
- IOS网络编程之请求内容
资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...
- 转:IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- 使用FreeCookies 控制浏览器cookies及修改http响应内容
FreeCookies 插件安装 :您的计算机需要已经安装Fiddler (如未安装,请至官网下载安装 http://docs.telerik.com/fiddler/configure-fiddle ...
- 【转】IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
随机推荐
- winform利用委托delegate进行窗体间通信
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- 修改MySQL数据库密码
在mysql数据库里面有一个默认安装的数据库是mysql,里面有一个user表.里面的字段Host是运行登录的ip地址,User 是登录的账号Password是密码. use mysql;//使用my ...
- Java语言的9个主要特性
Java作为时下很流行的一门编程语言,受到很多人的热爱,那么它有哪些特性呢?一起来看看吧. 1.Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用.另 ...
- Python爬虫从入门到放弃(十三)之 Scrapy框架的命令行详解
这篇文章主要是对的scrapy命令行使用的一个介绍 创建爬虫项目 scrapy startproject 项目名例子如下: localhost:spider zhaofan$ scrapy start ...
- UVa455 Periodic String 的wronganswer问题探讨,以及AC的新思路
题目的意思是一个字符串有某个长度为k的字符串通过不断重复形成的,而k被称为该字符串的周期.而我们所要做的是找出该字符串的最小周期. input The first line is an integer ...
- webpack 多页应用架构系列实战
阅读目录 1.webpack配置了解 2.webpack CommonsChunkPlugin公共代码剥离 3.了解ProvidePlugin的用途 回到顶部 1.webpack配置了解 webpac ...
- linux UART
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <errno.h ...
- Log4Net(一):快速入门
概览 Log4Net是Apache Log4J框架在.NET平台上的实现,它是一个帮助开发者将日志信息以多种方式(数据库.控制台.文件等)输出的开源工具. 为什么要使用日志记录 提供应用程序运行时状态 ...
- 导入 theano 失败。“cannot import name gof”
按照网上教程安装好了 theano 之后,import theano 出现错误."cannot import name gof".网上找了很多教程,都不可行.最后找到如下教程.亲测 ...
- 【HTML】dl dt dd
摘要 看到没怎么使用过的html 标签,记录下 定义 dl 类似于 ul ,无任何样式,自定义列表容器, ul 为无序列表容器,ol 为有序列表容器 dt dd 类似于 li ,无任何样式,为帮助实现 ...