示例

  • 1. 继承HttpServletRequestWrapper
  • 2. 配置拦截器
  • 3. 注册拦截器
  • 4. 配置过滤器,用来把request请求传递下去
  • 5. 在启动类中注册拦截器

1. 继承HttpServletRequestWrapper

package com.example.springboot.wrapper;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;public class RequestWrapper extends HttpServletRequestWrapper {private final String body;public RequestWrapper(HttpServletRequest request) {super(request);StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = null;InputStream inputStream = null;try {inputStream = request.getInputStream();if (inputStream != null) {bufferedReader = new BufferedReader(new InputStreamReader(inputStream));char[] charBuffer = new char[128];int bytesRead = -1;while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {stringBuilder.append(charBuffer, 0, bytesRead);}} else {stringBuilder.append("");}} catch (IOException ex) {} finally {if (inputStream != null) {try {inputStream.close();}catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();}catch (IOException e) {e.printStackTrace();}}}body = stringBuilder.toString();}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());ServletInputStream servletInputStream = new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return byteArrayInputStream.read();}};return servletInputStream;}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream()));}public String getBody() {return this.body;}
}

2. 配置拦截器

package com.example.springboot.interceptor;import com.example.springboot.wrapper.RequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component("parameterInterceptor")
@Slf4j
public class ParameterInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);String body = requestWrapper.getBody();log.info("post request parameter ----> " + body);httpServletRequest.setAttribute("body", new RequestWrapper(httpServletRequest).getBody());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//        super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}

3. 注册拦截器

package com.example.springboot.config;import com.example.springboot.interceptor.ParameterInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;// 方式一:
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//註冊TestInterceptor拦截器InterceptorRegistration registration = registry.addInterceptor(new ParameterInterceptor());registration.addPathPatterns("/vds/education/*");  // 指定路径下的都被拦截 最好不使用/**/*registration.excludePathPatterns("/","/error","/static/**");       //添加不拦截路径*/}
}
config:path:special: - 需要拦截的路径1- 需要拦截的路径2- ...
package com.example.springboot.config;import com.example.springboot.interceptor.ParameterInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;// 方式二: 通过配置文件设置拦截路径
@Configuration
@ConfigurationProperties(prefix = "config.path")
public class InterceptorConfigurer implements WebMvcConfigurer {private List<String> special = new ArrayList<>();public List<String> getSpecial() {return special;}public void setSpecial(List<String> special) {this.special = special;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册ParameterInterceptor拦截器InterceptorRegistration registration = registry.addInterceptor(new ParameterInterceptor());registration.addPathPatterns(special);  // 指定路径都被拦截 最好不使用/**/*registration.excludePathPatterns("/","/error","/static/**");       //添加不拦截路径*/}
}

4. 配置过滤器,用来把request请求传递下去

package com.example.springboot.filter;import com.example.springboot.wrapper.RequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;// @Component
// @Component会将类自动注册为bean 在启动类中再用@ServletComponentScan扫描注册bean会出现bean重复注册报错,二者选其一 或者在配置文件中启用覆盖同名bean spring.main.allow-bean-definition-overriding=true
@WebFilter(urlPatterns = "/*",filterName = "channelParameterFilter")
@Slf4j
public class ChannelParameterFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {log.info("filer 初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("过滤操作");ServletRequest requestWrapper = null;if (servletRequest instanceof HttpServletRequest) {requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);}if (requestWrapper == null) {filterChain.doFilter(servletRequest, servletResponse);} else {filterChain.doFilter(requestWrapper, servletResponse);}}@Overridepublic void destroy() {log.info("销毁过滤器");}
}

5. 在启动类中注册拦截器

package com.example.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Configuration;@SpringBootApplication
/*** 使用 @ServletComponentScan 注解* Servlet 可以直接通过 @WebServlet 注解自动注册* Filter 可以直接通过 @WebFilter 注解自动注册* Listener 可以直接通过 @WebListener 注解自动注册*/
@ServletComponentScan("com.example.springboot.filter")  //注册过滤器注解
// @Component会将类自动注册为bean 在启动类中再用@ServletComponentScan扫描注册bean会出现bean重复注册报错,二者选其一 或者在配置文件中启用覆盖同名bean spring.main.allow-bean-definition-overriding=true
@Configuration
public class SpringBootTestApplication {public static void main(String[] args) {SpringApplication.run(SpringBootTestApplication.class, args);}
}

springboot利用拦截器和过滤器获取post请求参数相关推荐

  1. Springboot:拦截器和过滤器

    在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect. 请求从Filter-- ...

  2. SpringBoot 拦截器和过滤器

    拦截器和过滤器 时光飞逝,最近也是很忙,但是忙到最后发现在自己并没有太多的成长 工作 学习 生活 没想到成长是不经意间的,像是被 推着,让你身不由己 午休时间,写写博客,也是保留一些自己的时间和空间 ...

  3. 关于SSM框架设置拦截器和过滤器

    我们知道拦截器和过滤器都是在项目中起到拦截过滤请求的功能,所以可能在设置的时候会傻傻分不清.这里我们先来比较它们的区别. 过滤器Filter是JavaEE标准,在Servlet的规范中定义的,是Ser ...

  4. 详解拦截器和过滤器的区别

    拦截器和过滤器的区别 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对acti ...

  5. 拦截器和过滤器有什么区别?

    首先了解什么是过滤器什么是拦截器 ①过滤器(Filter) 过滤器通过直接实现Filter接口实现,也可以通过@WebFilter注解实现特定的URL拦截 在Filter接口中定义了三个方法: ini ...

  6. 区分Java拦截器和过滤器

    今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...

  7. 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别

    转自:https://www.cnblogs.com/shangc/p/5939708.html 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别.其主要区别为以下几点: 1)拦截器是基于 ...

  8. struts2中拦截器和过滤器的比较

    拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...

  9. 【SpringMVC】拦截器和过滤器

    拦截器: 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口. 拦截器和过滤器类似,功能方向侧重点不同. 过滤器是用来过滤器请求参数,设置编码字符集等工作. 拦截器是 ...

  10. java 拦截器和过滤器的区别

    介绍 在 Java Web 应用程序中,拦截器和过滤器是两种不同的机制,用于在请求/响应处理过程中进行拦截和过滤.两者都可以用来在请求到达目标资源之前对其进行预处理.修改或拦截. 但是,拦截器和过滤器 ...

最新文章

  1. c语言写输入汉字输出区位码程序,2017年计算机应用基础检测试题
  2. .net 转换任意类型不报错
  3. python编程输入标准-青少年Python编程能力标准等级模拟考试
  4. iOS 9之3D Touch
  5. VNC实现Windows远程访问Ubuntu 16.04【转载】
  6. project不显示里程碑标志_在Project中设置里程碑
  7. 《为iPad而设计:打造畅销App》——将iPad作为视频娱乐设备
  8. java跟其_java跟其他语言比有哪些优势?
  9. Python函数参数类型*、**的区别
  10. 华南主板超频设置图解_支持XMP2.0,3000稳超3733MHz,威刚龙耀D60G超频体验
  11. X264码率控制总结——ABR,CQP,CRF
  12. 洛谷P5706 【深基2.例8】再分肥宅水__C++描述
  13. 网站服务器域名费用入什么科目,企业域名服务费记什么科目
  14. 荣耀V30系列正式发布,它有满足你对5G手机的期待吗?
  15. Java源码阅读(类图自动生成工具)
  16. 华为智慧屏x1是鸿蒙系统吗,荣耀智慧屏x1和华为智慧屏s55有什么区别?哪个值得买...
  17. 怎么看计算机电源型号,鲁大师怎么看电源 鲁大师电源参数查看方法
  18. ubuntu和win10双系统安装教程
  19. MATLAB中关于sort函数的默认排序
  20. 12.ROS编程学习:ROS常用指令

热门文章

  1. 计算机网络在电力系统继电保护的应用毕业论文,电力系统继电保护技术 毕业论文.doc...
  2. vs2008 SP1 安装问题小解决方案
  3. setup factory 设置默认字段的值
  4. PGP加密解密QQ邮箱邮件
  5. 利用arcgis基本比例尺标准分幅编号流程
  6. 立创开源|esp8266三路继电器
  7. SPSS 24安装教程详细步骤
  8. 白帽子讲web安全(精写含思维导图)
  9. 分布式及架构设计理论
  10. CEF加载PPAPI插件