利用HttpServletRequestWrapper对HttpServletRequest进行封装的方法

本文详细阐述了在处理HTTP请求时,如何通过HttpServletRequest的封装实现对于inputStream内容的权限验证,确保请求的安全性。文章重点介绍了Filter中对inputStream的读取方式,以及在Controller层如何提取并处理这些内容,最终实现对post/put/delete请求的有效响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,说明几个类和方法的关系: class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest 

     在Filter中由于需要的对于inputStream的内容进行权限验证,我们必须将所有input内容读取出来,但是在Controller层中程序同样需要提取input的内容,进而执行对应的post/put/delete请求,因此,我们在此对HttpServletRequest进行了封装,并对封装后的HttpServletRequestWrapper的getInputStream方法进行了重载,保证重载后的方法可以再次读取到inputStream中的所有内容。

package com.jeremyxu.xinterface.wrapper;


import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.pptv.cloud.ppsync.common.exception.CloudRuntimeException;
import com.pptv.cloud.ppsync.common.util.StringUtils;


public class FilterRequestWrapper extends HttpServletRequestWrapper {
    private static Logger log = LoggerFactory.getLogger(FilterRequestWrapper.class);

    private final String payload;
    private String encoding = null;

    public FilterRequestWrapper (HttpServletRequest request) {

        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        String encoding = request.getCharacterEncoding();
        try {

            // read the payload into the StringBuilder

           //按照正确的encoding,将inputStream中的内容写入到String中

            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                if (StringUtils.isEmpty(encoding)) {
                    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                } else {
                    this.encoding = encoding;
                    bufferedReader = new BufferedReader(new InputStreamReader(inputStream, encoding));
                }
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                // make an empty string since there is no payload
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            log.error("Error reading the request payload", ex);
            throw new CloudRuntimeException("Error reading the request payload", ex);
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException iox) {
                    // ignore
                }
            }
        }
        payload = stringBuilder.toString();
    }

    public String getPayload() {
        return this.payload;
    }

    @Override

     重载getInputStream方法,获取ServletInputStream流

    public ServletInputStream getInputStream ()
        throws IOException {
    
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
                StringUtils.isEmpty(encoding)? payload.getBytes() : payload.getBytes(encoding));

        ServletInputStream inputStream = new ServletInputStream() {
            public int read ()
                throws IOException {
                return byteArrayInputStream.read();
            }
        };
        return inputStream;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值