Filter过滤器进行统一参数处理demo
Filter过滤器进行统一参数处理demo
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; public class ReplaceStreamFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(ReplaceStreamFilter.class); @Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("StreamFilter初始化...");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ServletRequest requestWrapper = null;
//获取请求中的流,将取出来的字符串,再次转换成流,然后把它放入到新request对象中,
if (request instanceof HttpServletRequest) {
log.info(">>>ChangeStudentNameRequestWrapper");
requestWrapper = new ChangeStudentNameRequestWrapper((HttpServletRequest) request);
}
// 在chain.doFiler方法中传递新的request对象
if (requestWrapper == null) {
chain.doFilter(request, response);
} else {
log.info(">>>chain.doFilter requestWrapper");
chain.doFilter(requestWrapper, response);
}
} @Override
public void destroy() {
log.info("StreamFilter销毁...");
}
} import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.mytester.entity.Student; import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset; public class ChangeStudentNameRequestWrapper extends HttpServletRequestWrapper {
/**
* 存储body数据的容器
*/
private byte[] body; /**
* 构造函数
* @param request
* @throws IOException
*/
public ChangeStudentNameRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
//接下来的request使用这个
String bodyStr = getBodyString(request);
body = bodyStr.getBytes(Charset.defaultCharset());
} /**
* 获取请求Body
*
* @param request request
* @return String
*/
public String getBodyString(final ServletRequest request) {
try {
return inputStream2String(request.getInputStream());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 获取请求Body
*
* @return String
*/
// public String getBodyString() {
// final InputStream inputStream = new ByteArrayInputStream(body);
// return inputStream2String(inputStream);
// } /**
* 将inputStream里的数据读取出来并转换成字符串
*
* @param inputStream inputStream
* @return String
*/
private String inputStream2String(InputStream inputStream) {
StringBuilder sb = new StringBuilder();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset()));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
JSONObject jsonObject = JSONObject.parseObject(sb.toString());
if (jsonObject != null) {
System.out.println("json=" + jsonObject.toString()); Student student = JSONObject.parseObject(jsonObject.toString(), Student.class); System.out.println("修改之前的学生名称为:" + student.getName());
student.setName("amd-modify"); //改变值
return JSON.toJSONString(student);
}
return sb.toString();
} @Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream inputStream = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
} import java.io.Serializable; public class Student implements Serializable{ private static final long serialVersionUID = -339516038496531943L;
private String sno;
private String name;
private String sex;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
return "Student{" +
"sno='" + sno + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
} //注册
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration
public class MyFilterConfig {
/**
* 注册过滤器
* 未设置addUrlPatterns,默认是全部的拦截
* @return FilterRegistrationBean
*/
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
registration.setFilter(replaceStreamFilter());
registration.addUrlPatterns("/changeStudentName");
registration.setName("replaceStreamFilter");
return registration;
} /**
* 实例化StreamFilter
*
* @return Filter
*/
@Bean(name = "replaceStreamFilter")
public Filter replaceStreamFilter() {
return new ReplaceStreamFilter();
}
} //测试
@RestController
public class TestController {
/**
* http://localhost:8080/changeStudentName
* 参数:{"sno":"1112","name":"xiaoming","sex":"man"}
* 返回:
* Student{sno='1112', name='amd-modify', sex='man'}
*
* @param student
* @return
*/
@RequestMapping(value = "/changeStudentName", method = RequestMethod.POST)
public String changeStudentName(@RequestBody Student student, HttpServletRequest request) {
return student.toString();
}
}
Filter过滤器进行统一参数处理demo的更多相关文章
- Java防止SQL注入2(通过filter过滤器功能进行拦截)
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
- Filter(过滤器)常见应用
孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...
- 【Servlet】Filter过滤器的编写和配置
Servlet的Filter介绍 在Servlet作为过滤器使用时,它可以对客户的请求进行过滤处理,当它处理完成后,它会交给下一个过滤器处理,就这样,客户的请求在过滤链里一个个处理,直到请求发送到目标 ...
- JavaWeb(五)Filter过滤器
Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...
- Listener监听器和Filter过滤器
Listener监听器 WEB中的监听器 WEB 中的 Listener 和 Filter 是属于 Servlet 规范中的高级的技术.WEB中的监听器共有三类八种(监听三个域对象)* 事件源:Ser ...
- JavaWeb学习篇--Filter过滤器
Filter过滤器简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的 java 类实现了这个接口,则把这个java类称之为过滤器Filter. WEB服务器每次在调用 ...
- 面试题:filter过滤器 listener 监听器 案例有点用
1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...
- JavaWeb -- Servlet Filter 过滤器
1. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在 ...
- Filter过滤器Listener:监听器
Filter过滤器 1. 概念 web中的过滤器:当访问服务器资源是,过滤器可以将请求拦截下来,完成一些特殊功能: 过滤器的作用 完成通用的操作:例如登录验证.统一编码处理.敏感字符过滤... 快速入 ...
- filter 过滤器(监听)
Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...
随机推荐
- Scheduled SQL: SLS 大规模日志上的全局分析与调度
简介: 本文总结了大规模日志全局分析的需求,讨论SLS上现有的典型分析方案,并延伸到 SLS 原生数据处理方案,介绍 Schedueld SQL 功能与最佳实践. 大规模日志全局分析的需求 数据大规模 ...
- await this.$nextTick()和this.$nextTick(callback)有什么区别?记一次bug调试
背景 需要实现一个需求,一个小区业务详情页面,在左侧菜单栏切换了小区后,详情页跟着切换. 这个详情页面是根据url上的/:id来确定小区id的,所以切换了小区后,应该切换路由. 于是这样实现: wat ...
- vue-cli快速搭建项目的几个文件(二)
=======ggcss样式======== :root{ --bgColor : #d3252a; --pinkColor : #ff4e81; --textColor : ...
- java引入jep实现四则运算包含负数且规范两位小数
1.在pom中引入依赖 <!--四则运算--> <dependency> <groupId>jep</groupId> <artifactId&g ...
- 羽夏壳世界—— PE 解析的实现
写在前面 此系列是本人一个字一个字码出来的,包括代码实现和效果截图. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后 ...
- DP-Modeler软件初步教程1:数据文件导入
1.导入航拍影像的空三文件 先打开DPSlnManager.exe软件,DP数据管理是用这个软件来操作的. 先从CC中导出空间文件,XML格式和无损影像.然后导入到DP 2.从CC中导出OSGB,然 ...
- PageOffice 6 最简集成代码(VUE+Springboot)
本文描述了PageOffice产品在(VUE+Springboot)前后端分离的项目中如何集成调用.调用PageOffice打开文件的主要核心代码是:后端Springboot项目中第6步和前端VUE项 ...
- sass的几种输出格式,你都知道吗
输出格式说明 Sass编译输出的CSS格式可以自定义. 有4种输出格式: :nested – 嵌套格式 :expanded – 展开格式 :compact – 紧凑格式 :compressed – 压 ...
- 阿里巴巴 MySQL 数据库之建表规约(一)
建表规约 强制部分 [强制] 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否). 说明:任何字段如果为非负数,必须是 ...
- Anaconda 虚拟环境
1. 查看虚拟环境 conda env list 2. 创建虚拟环境 conda create -n env_name python=3.8 --- env_name: 虚拟环境名 --- pytho ...