Filter中获取传递参数方式(解决post请求参数问题)

这篇文章主要介绍了Filter中获取传递参数方式(解决post请求参数问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Filter中获取传递参数方式(解决post请求参数问题),久久派带你了解更多相关信息。

目录
  • Filter中获取传递参数
    • 1. GET 传递
    • 2. Post 传递
      • XyRequestWrapper 类
      • XySecurityFilter

Filter中获取传递参数

1. GET 传递

参数可以直接通过request.getParameter获取。

2. Post 传递

产生不能过直接从request.getInputStream() 读取,必须要进行重新写。(request.getInputStream()只能够读取一次)

方式:

通过重写 HttpServletRequestWrapper 类 获取getInputStream中的流数据,然后在将body数据进行重新写入传递下去。

XyRequestWrapper 类

package com.xy.boot.cmiap.filter; import com.alibaba.fastjson.JSONObject;import com.xy.boot.common.util.StringUtils;import org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper;import org.apache.commons.codec.Charsets; import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import java.io.*;import java.util.Enumeration;import java.util.HashMap;import java.util.Map; /** * Created by fuwenshen * Date:2018/10/26 * Time:12:21 */public class XyRequestWrapper extends HttpServletRequestWrapper {     private String body;     public XyRequestWrapper(HttpServletRequest request) throws IOException {        super(request);        StringBuilder stringBuilder = new StringBuilder();        BufferedReader bufferedReader = null;        try {            InputStream inputStream = request.getInputStream();            if (inputStream != null) {                bufferedReader = new BufferedReader(new InputStreamReader(inputStream,\"UTF-8\"));                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) {            throw ex;        } finally {            if (bufferedReader != null) {                try {                    bufferedReader.close();                } catch (IOException ex) {                    throw ex;                }            }        }        body = stringBuilder.toString();    }      @Override    public ServletInputStream getInputStream() throws IOException {        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes(\"UTF-8\"));        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(), Charsets.UTF_8));    }     public String getBody() {        return this.body;    }      @Override    public String getParameter(String name) {        return super.getParameter(name);    }     @Override    public Map<String, String[]> getParameterMap() {        return super.getParameterMap();    }     @Override    public Enumeration<String> getParameterNames() {        return super.getParameterNames();    }     @Override    public String[] getParameterValues(String name) {        return super.getParameterValues(name);    }      /**     * 设置自定义post参数 //     *     * @param paramMaps     * @return     */    public void setParamsMaps(Map paramMaps) {        Map paramBodyMap = new HashMap();        if (!StringUtils.isEmpty(body)) {            paramBodyMap = JSONObject.parseObject(body, Map.class);        }        paramBodyMap.putAll(paramMaps);        body = JSONObject.toJSONString(paramBodyMap);    }}

XySecurityFilter

package com.xy.boot.cmiap.filter; import com.alibaba.fastjson.JSONObject;import com.xy.boot.cmiap.bo.VerifyTokenResultBO;import com.xy.boot.cmiap.constant.HttpConstant;import com.xy.boot.cmiap.entity.enums.XyHttpCodeEnum;import com.xy.boot.cmiap.service.IXySecurityService;import com.xy.boot.cmiap.service.helper.XyHttpSecurityHelper;import com.xy.boot.common.util.StringUtils;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.http.MediaType;import org.springframework.stereotype.Component; import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.*; /** * Created by fuwenshen * Date:2018/10/29 * Time:15:36 */@Component@Slf4j@WebFilter(filterName = \"xySecurityFilter\", urlPatterns = {\"/api/adv/*\"})public class XySecurityFilter implements Filter {     @Value(\"${verify_token_switch}\")    private boolean tokenSwitch;    @Value(\"${zy.app_secret}\")    private String zyAppSecret;    @Value(\"${zy.token}\")    private String zyToken;     //验证 token bo    private VerifyTokenResultBO tokenBO=null;     @Autowired    private IXySecurityService iXySecurityService;     @Override    public void init(FilterConfig filterConfig) throws ServletException {     }     @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        log.debug(\"进入XySecurityFilter!\");        // 参数集合 初始化        TreeMap paramsMaps = new TreeMap();        String token = null, v = null, timestamp = null, sign = null;         HttpServletRequest req = (HttpServletRequest) request;        HttpServletResponse resp = (HttpServletResponse) response;        resp.setCharacterEncoding(\"UTF-8\");        resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);        /**         * 验证通用请求头是否完整         */        token = req.getHeader(HttpConstant.TOKEN);        v = req.getHeader(HttpConstant.V);        timestamp = req.getHeader(HttpConstant.TIMESTAMP);        sign = req.getHeader(HttpConstant.SIGN);        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(v) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(sign)) {            resp.sendError(XyHttpCodeEnum.ILLEGAL_REQUEST.getCode(), XyHttpCodeEnum.ILLEGAL_REQUEST.getMessage());            return;        }         // 防止流读取一次后就没有了, 所以需要将流继续写出去        XyRequestWrapper requestWrapper = new XyRequestWrapper(req);         /**         * 校验token         */        /*********************************************************/          /**         * 获取请求参数         */        if (\"POST\".equals(req.getMethod().toUpperCase())) {            String body = requestWrapper.getBody();            paramsMaps = JSONObject.parseObject(body, TreeMap.class);            log.debug(\"parameterMap:\" + paramsMaps.toString());         } else {             Map<String, String[]> parameterMap = requestWrapper.getParameterMap();            Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();            Iterator<Map.Entry<String, String[]>> iterator = entries.iterator();            while (iterator.hasNext()) {                Map.Entry<String, String[]> next = iterator.next();                paramsMaps.put(next.getKey(), next.getValue()[0]);            }            log.debug(\"parameterMap:\" + paramsMaps.toString());        }          /**         * 验证签名是否合法         */        /***************************************/         //设置企业信息(自定义参数)        if(tokenBO!=null){            Map paramsPlus = new HashMap();            paramsPlus.put(HttpConstant.TOKEN, tokenBO.getTokenCode());            paramsPlus.put(HttpConstant.APPID, tokenBO.getAppid());            requestWrapper.setParamsMaps(paramsPlus);        }         chain.doFilter(requestWrapper, response);     }      @Override    public void destroy() {     }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/18280.html

(0)
nan
上一篇 2021-08-28
下一篇 2021-08-28

相关推荐

  • 淄博张店烧烤倡议高考停业三天:全力为考生营造一个安静的考试环境 !

    据报道,高考来临之际,山东淄博张店区烧烤协会发布了《致全体烧烤经营业主的倡议书》:从6月6日晚至9日晚,各烧烤店铺暂停营业,全力为考生营造一个安静的考试环境。张店区烧烤协会会长刘静表示,接下来,协会成员也将到考点参加志愿服务,“尽我们所能,为考生们多提供一些更好的服务。”今年年初淄博烧烤走红,张店区

    热点头条 2023-06-05
    0
  • 淘宝采集软件(无货源采集软件哪个好)

    淘宝采集软件(无货源采集软件哪个好)。久久派带你了解更多相关信息。大部分商家都会进行商品图片的采集,并上架,但是商品太多的情况下会不记得商品的标题以及价格之类的信息,于是又要花很长时间去找到原商品参考信息,,今天教大家一个方法,能够在下载商

    2022-01-18 热点头条
    0
  • 腾讯体育怎么看奥运直播?腾讯体育看奥运直播教程

    2020年的东京奥运会终于来了,很多小伙伴正在使用什么软件看奥运会呢?是不是比较专业的腾讯体育app呢,今天小编就来带大家看看腾讯体育app怎么观看奥运会

    2021-07-29 热点头条
    0
  • 如何用u盘安装系统(u盘重装win10系统步骤)

    怎么使用u深度一键重装win10系统,安装win10系统:安装前准备工作:1、下载u深度u盘启动盘制作工具2、将u盘制作成u盘启动盘3、下载原版win10系统镜像并存入u盘启动盘;1、将u盘启动盘插入usb接口,重启电脑进入u深度菜单

    2022-01-14 热点头条
    0
  • 中国有讲究29岁是坎?人29岁时为什么有大劫?都说29跨30岁是个坎

    坎在汉语词典中的意思是低洼的地方或困窘的处境,我们也常常拿它来形容人生遇到的一些困境,当我们遇到了难捱的关就会说遇到坎了,中国有讲究29岁是坎,那么人29岁时为什么有大劫呢?下面就跟趣讯吧小编来详细了解一下吧!

    2021-09-19
    0
  • 网传一沙漠景区沙下埋20厘米三角钉 !扎破了多辆汽车的车胎 !

    5月6日消息,据报道,近日有网友爆料称,一沙漠越野景区沙下被埋三角钉,扎破了多辆汽车的车胎。报道称,事件发生于内蒙古自治区通辽市库伦旗银沙湾景区,视频中,有车友正在沙漠中挖掘被埋在地下的尖锐金属制品,旁边还扔着一个已经被挖出来的同款。从他们的对话中可以得知,这种埋在地下的三角钉,已经致使多车爆胎,视

    热点头条 2023-05-06
    0

发表回复

登录后才能评论