java - 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
}
};
}
}
问题
有可能做到这一点吗?我错过了什么?
在前端,我尝试发送一个正文加密的多部分请求,但它不起作用,因为多部分请求似乎需要一个“键/值”正文。这就是我发送文本/纯文本的原因。
解决方案
推荐阅读
- css - 使用 flexbox,我如何创建这个简单的应用程序页面登录屏幕?
- angular - 需要在 Angular 的 mat-dialog 上显示额外的数据
- c++ - 在编辑器属性更改中未调用 UWidget::SynchronizeProperties()
- google-bigquery - 访问 DataStudio 报告上的安全 GCS 图像
- laravel - Laravel 多列上的多对多同步()
- java - Java / Unix:如果另一个进程尝试在其间读取文件,一个进程能否成功写入文件
- python - AES 解密输出到字符串
- javascript - 如何防止feathers.js返回用户路由中的所有用户
- java - Java 中有没有办法将 Gherkin 文档格式化为字符串?
- c# - 尽管 csproj 中有 HintPath 和 ReferencePath,但 C# 项目无法找到参考