J2EE Filter中修改request内容
最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容。
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);
- }
- }
- }
- }
- }
J2EE Filter中修改request内容的更多相关文章
- 解决在Filter中读取Request中的流后,后续controller或restful接口中无法获取流的问题
首先我们来描述一下在开发中遇到的问题,场景如下: 比如我们要拦截所有请求,获取请求中的某个参数,进行相应的逻辑处理:比如我要获取所有请求中的公共参数 token,clientVersion等等:这个时 ...
- 解决在Filter中读取Request中的流后, 然后再Control中读取不到的做法
摘要: 大家知道, StringMVC中@RequestBody是读取的流的方式, 如果在之前有读取过流后, 发现就没有了. 我们来看一下核心代码: filter中主要做的事情, 就是来校验请求是否合 ...
- InstallShield2015制作安装包----------安装过程中修改文件内容
//修改安装目录下autostart.vbs里的路径 //打开文件 OpenFileMode(FILE_MODE_NORMAL); strPath=INSTALLDIR+"centerAut ...
- 修改Request 中的数据
拦截器修改参数 今天一位网友开发中遇到一个需求,他需要在Request中修改传递过来的数据.开始的时候他在拦截器中修改,在拦截器中可以获取到从前台request中 传递过来的数据.他写法大致如下:自定 ...
- Fiddler设置断点修改Request和Response
一.Fiddler中修改Request有两种方法: 点击Rules-> Automatic Breakpoint ->Before Requset (这种方法会中断所有的会话) 消除命令 ...
- 使用HttpServletRequestWrapper在filter修改request参数
javax.servlet.ServletRequest中的 Map<String, String[]> parameterMap = request.getParameterMap(); ...
- 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?
原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
Visual Studio 2017中使用正则修改部分内容 最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...
- OC中加载html5调用html方法和修改HTML5内容
1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...
随机推荐
- Spring IOC 源码简单分析 02 - Bean Reference
### 准备 ## 目标 了解 bean reference 装配的流程 ##测试代码 gordon.study.spring.ioc.IOC02_BeanReference.java ioc02 ...
- 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程
Ruby XML, XSLT 和 XPath 教程 什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种 ...
- link @import区别 src href的区别
先说页面引入css的四种方式吧 1 在头部写在style里面 2 行内样式 tyle= 3 外部引入 link和@import的区别 link属于XHTML的标签,而@import只是css提供的一种 ...
- 使用Bus.js进行兄弟(非父子)组件通信
首先需要在任意地方添加一个bus.js: 在bus.js里面 写入下面信息 import Vue from 'vue' export default new Vue; 在需要通信的组件都引入Bus.j ...
- 【hive】分组求排名
分组求排名 相信好多使用Mysql的用户一定对分组求排名的需求感到发怵. 但是在hive或者oracle来说就能简单实现. 采用窗口函数:rank() over() / row_number() ov ...
- c++ o2 优化
有时候,写代码的时候要卡常 这时候就要用到o2优化 #pragma GCC optimize(2) 只要把这句话加在程序开头,就可以手动开o2优化了
- idea里面Java文件显示一个x
idea里面Java文件显示一个x,编译时过滤了,setting->builder->compiler->excludes
- Google Web Designer打开白屏问题的解决方案
Google Web Designer是谷歌出品的一个可视化的 HTML5 网页和广告的设计开发工具 Google Web Designer . 官网地址:https://www.google. ...
- Linux下各文件夹的含义和用途
Linux根目录”/“下各个系统文件夹的含义和用途 1./boot 该目录默认下存放的是Linux的启动文件和内核. 2./initrd 它的英文含义是boot loader initialized ...
- ReactNative 问题集合
在线流畅播放视频 (建议调用原生的视频组件, 或者在成熟的安卓 ios组件封装一层) 如何指定页面横屏 (在这个组件react-native-orientation基础上改写) webSocket不和 ...