2022-07-01 11:56
@lyh061619
[常规请求]:
获取request->获取加密参数->参数解密装载进request->next.handle(target, request, response, isHandled)->validate->controller。
[multipart/form-data请求]:
获取MultipartRequest->getFiles()->获取加密参数->参数解密装载进request->next.handle(target, request, response, isHandled)->validate->controller。
问题就在于MultipartRequest不能像JsonRequest那样可劲new。而且原生的MultipartRequest嵌入在其它代码类,重新继承MultipartRequest,不知道有没有类似setJsonRequestFactory的方法来接管。
2022-07-01 11:40
@lyh061619
上文提到的EpRequestWrapper,就是类似MyJsonRequest 的实现。非文件上传类的请求,按此已经实现了需求。这里主要是兼容multipart/form-data请求,需要前置执行getFiles()方法获取文件后,便与后续其它参数的正常获取。
2022-06-30 16:50
@JFinal 后续版本是否可以为MultipartRequest扩展此功能。主要解决一次请求中途参数二次修改的使用场景。
2022-06-30 16:46
@杜福忠 已处理成功,采用的方式是新建同名com.jfinal.upload.MultipartRequest类替代JFinal原生类,具体改动如下
1.新增params变量
public Map params = new HashMap<>();
2.构造方法 增加initParam()调用,用来初始化自定义参数
public MultipartRequest(HttpServletRequest request, String uploadPath, long maxPostSize, String encoding) {
super(request);
wrapMultipartRequest(request, getFinalPath(uploadPath), maxPostSize, encoding);
initParam();
}
public MultipartRequest(HttpServletRequest request, String uploadPath, long maxPostSize) {
super(request);
wrapMultipartRequest(request, getFinalPath(uploadPath), maxPostSize, encoding);
initParam();
}
public MultipartRequest(HttpServletRequest request, String uploadPath) {
super(request);
wrapMultipartRequest(request, getFinalPath(uploadPath), maxPostSize, encoding);
initParam();
}
public MultipartRequest(HttpServletRequest request) {
super(request);
wrapMultipartRequest(request, baseUploadPath, maxPostSize, encoding);
initParam();
}
private void initParam(){
Map map = new HashMap();
Enumeration enumm = multipartRequest.getParameterNames();
while (enumm.hasMoreElements()) {
String name = (String) enumm.nextElement();
map.put(name, multipartRequest.getParameterValues(name));
}
this.params.putAll(map);
}
3.增加参数变动方法,addParameter、removeParameter
4.重写getParameterNames、getParameter、getParameterValues、getParameterMap方法
2022-06-30 14:36
@杜福忠 这边的加密是所有请求参数的json数据整体加密。请求公共参数有3个,业务参数随机,解密后把业务参数重新按照键值封装进request进行中继。如果前面new MultipartRequest()后,后面再进行new EpRequestWrapper()进行参数值修改,一直报Corrupt form data: premature ending异常。
2022-06-30 14:18
@杜福忠 整体请求逻辑如下
1.接收前端发起请求(文件未加密,参数加密)
2.handler内获取request,并执行getFiles()方法,保障后续请求参数获取
3.对加密数据进行解密,并对请求参数进行明文化新增或修改
4.请求参数中继至Validator、Controller
2022-06-30 14:13
@杜福忠 又尴尬了,此问题是延续上次参数注入问题(https://jfinal.com/feedback/8299),之前没有考虑到文件上传,现在一旦先new MultipartRequest,导致后面request内的请求参数无法修改。继承MultipartRequest自定义实现,内部的multipartRequest为私有对象,无法获取。完全重写MultipartRequest方法,又导致baseUploadPath,maxPostSize,encoding需要手动自定的问题