自从过去两天以来,我正在研究以下情况, 我开发了一个java过滤器,检查请求是否是多部分类型, 如果是,我想限制.php文件上传。 在servlet过滤器中,我成功检索了文件类型,如果它是有效的,我已转发该请求继续。 现在我的业务逻辑在没有过滤器的情况下工作正常,现在无法上传。 我的项目是使用Spring框架。 在业务逻辑上,我使用MultipartRequest(弹簧类)作为投射。 调用request.getFileNames(),它在涉及过滤器之后不返回任何内容。
在过滤器中,我在验证文件扩展名后包装了请求,如下所示: 所有表单字段都在参数映射中设置,将随请求一起传递。 并且文件类型字段在请求对象中设置为属性。
你能帮忙吗?谢谢, Namrata Shah
答案 0 :(得分:0)
在doFilter()
,
我已经检查过收到的请求是否是HttpServletRequest的实例。如果是,那么如果它是使用以下代码的多部分请求,它将被解析:
parseRequest():
{
List<FileItem> multipartItems = null;
try
{ multipartItems = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
}
catch (FileUploadException e)
{
throw new ServletException("Cannot parse multipart request: " + e.getMessage());
}
Map<String, String[]> parameterMap = new HashMap<String, String[]>();
for (FileItem multipartItem : multipartItems)
{
if (multipartItem.isFormField())
processFormField(multipartItem, parameterMap);
else
processFileField(multipartItem, request);
}
return wrapRequest(request, parameterMap);
}
答案 1 :(得分:0)
processFormField()
的代码:
String name = formField.getFieldName(),value = formField.getString();
String[] values = parameterMap.get(name);
if (values == null)
{
parameterMap.put(name, new String[]{value});
}
else
{
int length = values.length;
String[] newValues = new String[length + 1];
System.arraycopy(values, 0, newValues, 0, length);
newValues[length] = value;
parameterMap.put(name, newValues);
}
答案 2 :(得分:0)
processFileField()
的代码:
request.setAttribute(fileField.getFieldName(), fileField);
然后,我将请求包装如下:
private static HttpServletRequest wrapRequest(
HttpServletRequest request, final Map<String, String[]> parameterMap)
{
return new HttpServletRequestWrapper(request)
{
@Override
public Map<String, String[]> getParameterMap()
{
return parameterMap;
}
public String[] getParameterValues(String name)
{
return parameterMap.get(name);
}
public String getParameter(String name)
{
String[] params = getParameterValues(name);
return params != null && params.length > 0 ? params[0] : null;
}
public Enumeration<String> getParameterNames()
{
return Collections.enumeration(parameterMap.keySet());
}
};
}