博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot 获取post请求参数
阅读量:4504 次
发布时间:2019-06-08

本文共 5917 字,大约阅读时间需要 19 分钟。

注意,request body中获取参数时使用流获取,但是request的流只能使用一次,

给出的办法就是在获取流之前对流进行复制否则会出异常

(request body miss)

spring请求的链式执行顺序为Filter-->拦截器-->controller

1:首先自定义一个类继承HttpServletRequestWrapper,用来备份流

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();    }    @Override    public ServletInputStream getInputStream() throws IOException {        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());        ServletInputStream servletInputStream = new ServletInputStream() {            @Override            public boolean isFinished() {                return false;            }            @Override            public boolean isReady() {                return false;            }            @Override            public void setReadListener(ReadListener readListener) {            }            @Override            public int read() throws IOException {                return byteArrayInputStream.read();            }        };        return servletInputStream;    }    @Override    public BufferedReader getReader() throws IOException {        return new BufferedReader(new InputStreamReader(this.getInputStream()));    }    public String getBody() {        return this.body;    }}
View Code

 

2、拦截器层面

 

import cn.com.connext.authority.config.RequestWrapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;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("authSecurityInterceptor")public class AuthSecurityInterceptor extends HandlerInterceptorAdapter {    private Logger logger = LoggerFactory.getLogger(AuthSecurityInterceptor.class);    @Override    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {        try {            RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);            String body = requestWrapper.getBody();            System.out.println(body);            return true;        }catch (Exception e){                    }        return false;    }    @Override    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {    }    @Override    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {    }}

 

这里body 就是获取到的请求参数,使用时注意,有些接口没有请求参数

 

③过滤器Filter,用来把request传递下去

import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import java.io.IOException;@WebFilter(urlPatterns = "/*",filterName = "channelFilter")public class ChannelFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }     @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        ServletRequest requestWrapper = null;        if(servletRequest instanceof HttpServletRequest) {            requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);        }        if(requestWrapper == null) {            filterChain.doFilter(servletRequest, servletResponse);        } else {            filterChain.doFilter(requestWrapper, servletResponse);        }    }     @Override    public void destroy() {    }}作者:woniu95链接:https://www.jianshu.com/p/69c6fba08c92來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
View Code

 

④在启动类中注册拦截器

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.MultipartConfigFactory;import org.springframework.boot.web.servlet.ServletComponentScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@SpringBootApplication@ServletComponentScan  //注册过滤器注解@Configurationpublic class WebApplication {    public static void main(String[] args) {        SpringApplication.run(WebApplication.class, args);    }}

 

感谢:https://www.jianshu.com/p/69c6fba08c92

转载于:https://www.cnblogs.com/lyon91/p/10208969.html

你可能感兴趣的文章
实训作业1
查看>>
日期控件 DatePicker 在ie8不能用
查看>>
多个表左联,要返回全部的结果,解决不能用where的问题
查看>>
hibernate left join fetch 出错的问题
查看>>
ifconfig,netstat command not found
查看>>
插入多个背景音乐
查看>>
英文外包
查看>>
ajax基础知识
查看>>
Activity与Service之间交互并播放歌曲
查看>>
在使用python3.7+channels时会出现rsync错误
查看>>
这一篇是运算符。。
查看>>
在ubuntu16.04+python3.5情况下安装nltk,以及gensim时pip3安装不成功的解决办法
查看>>
windows系统的安装时间怎么查看
查看>>
20180911-Java实例01
查看>>
Javascript Event
查看>>
解决IOS safari下滑动的“橡皮筋”效果
查看>>
asp.net 得到一个文件夹下的所有文件夹及子文件夹名,得到所有文件名,文件大小,文件夹大小...
查看>>
从keystore(jks)文件中提取私钥
查看>>
调整数组顺序使奇数位于偶数前面
查看>>
HackerRank "Training the army" - Max Flow
查看>>