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:48

常规请求,可以重新new无数次EpRequestWrapper,进行requeset封装,
MultipartRequest 因自身构造函数实现,只能new一次,否则报Corrupt form data: premature ending异常。

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需要手动自定的问题

2022-06-30 11:00

感谢两位大佬,已经实现目标需求,之前因为搞了个注解配置在Controller上用来标注请求类型,一直搞错方向在纠结如何获取Controller了。

2022-06-15 16:18

@杜福忠 感谢,已成功解决问题。

2022-06-15 13:36

@JFinal 进入到Controller,Request的类型已经变为JsonRequest/EpRequestWrapper,根据参数名也能获取到对应的参数值,唯独注入进来的一直是null。原始参数可以通过注入的形式直接使用。后续涉及变动修改的参数都还只能通过get(name)获取。

2022-06-15 13:11

@JFinal 这些接管得方法都有重新实现,在拦截器里把EpRequestWrapper替换成JsonRequest一样的结果。

2022-06-06 16:20

@JFinal 这样设置是全局处理吧,主要想对不同请求做响应区分,内建的页面还正常渲染到500错误页面,接口请求响应json数据