首页 > 解决方案 > Spring - 将请求 Content-Type: text/plain 更改为 Content-Type: multipart/form-data in a Filter

问题描述

我正在使用自定义加密来通信前端和后端。

我试图在过滤器(Spring GenericFilterBean)到达控制器之前更改请求内容类型。

更具体地说,我想将前端发送的请求 Content-Type: text/plain 更改为 Content-Type: multipart/form-data。

我做了一个信息图: 信息图

自定义过滤器.java

public class CustomFilter extends GenericFilterBean {

...

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    // ORIGINALS
    HttpServletRequest originalRequest = (HttpServletRequest) request;
    HttpServletResponse originalResponse = (HttpServletResponse) response;

    // DECRYPT REQUEST
    String bodyDecrypted = bodyDecrypted = decryptRequest(originalRequest); 

    CryptRequestWrapper wrappedRequest = new CryptRequestWrapper(originalRequest, bodyDecrypted.getBytes());
    CryptResponseWrapper wrappedResponse = new CryptResponseWrapper(originalResponse);


    // ---------------------------------------------//
    //           CHANGE CONTENT TYPE HERE?          //
    // ---------------------------------------------//


    // CHAIN
    chain.doFilter(wrappedRequest, wrappedResponse);
    
    // ENCRYPT RESPONSE
    String responseEncrypted = encryptResponse(vec, wrappedResponse); 
    response.getOutputStream().write(responseEncrypted.getBytes());

}

private String decryptRequest(HttpServletRequest originalRequest){
    // STUFF
}

private String encryptResponse(ModifyResponseBodyWrapper wrappedResponse){
    // STUFF
}

}

CryptRequestWrapper.java

public class CryptRequestWrapper extends HttpServletRequestWrapper {

    private final Logger log = LoggerFactory.getLogger(CryptRequestWrapper.class);

    private final ByteArrayInputStream decryptedDataBAIS;

    CryptRequestWrapper(HttpServletRequest request, byte[] decryptedData) {
        super(request);
        decryptedDataBAIS = new ByteArrayInputStream(decryptedData);

    }

    @Override
    public BufferedReader getReader() throws UnsupportedEncodingException {
        return new BufferedReader(new InputStreamReader(decryptedDataBAIS, StandardCharsets.UTF_8.name()));
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {

        return new ServletInputStream() {
            @Override
            public int read() {
                return decryptedDataBAIS.read();
            }

            @Override
            public boolean isFinished() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public boolean isReady() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {
                // TODO Auto-generated method stub
            }
        };

    }
}

问题

有可能做到这一点吗?我错过了什么?

在前端,我尝试发送一个正文加密的多部分请求,但它不起作用,因为多部分请求似乎需要一个“键/值”正文。这就是我发送文本/纯文本的原因。

标签: javaspringspring-mvcrequestmultipartform-data

解决方案


推荐阅读