关于enctype="multipart/form-data"及过滤器的怪异问题~~

qh8569 2012-12-29 04:09:16
目的:所有form提交的表单或地址栏传参的想过滤掉敏感词,所以写了一个过滤器,过滤普通的表单没有问题,但是当form中有enctype="multipart/form-data" 的时候,就出现问题了。 从网上查了N多资料,说是二进制什么的,在过滤器中修改了一下,可以验证是否存在敏感词了,但是chain.doFilter(request, response)之后 在Action中 确拿不到表单提交过来的值了。求高手帮助:这个过滤器该怎么写?


我的过滤器代码 如下:
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (isMultipart) {
System.out.println("上传文件的表单");

org.apache.commons.fileupload.FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items;
try {
items = upload.parseRequest(req);
Iterator iter = items.iterator();
while (iter.hasNext()) {
org.apache.commons.fileupload.FileItem item = (org.apache.commons.fileupload.FileItem) iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(name + "===" + value);
// 这个地方 打印正常,也就是说 可以拿到表单的值 for(String keyword : keywords){
if(value != null && value.trim().indexOf(keyword.trim()) != -1){
response = (HttpServletResponse)response;
request.setAttribute("error", StringUtil.errorBack("您输入了敏感词汇,请慎重操作!", ""));
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}

}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
chain.doFilter(request, response); // 这个地方改怎么写???
} else {
// 正常表单,验证及 传递 都没有问题。。。。
Enumeration enumparam = request.getParameterNames();
while(enumparam.hasMoreElements()){
String paramName=(String)enumparam.nextElement();
String[] values=request.getParameterValues(paramName);
for(int i=0;i<values.length;i++){
System.out.println(paramName + "=" + values[i]);
for(String keyword : keywords){
if(values[i] != null && values[i].trim().indexOf(keyword.trim()) != -1){
response = (HttpServletResponse)response;
request.setAttribute("error", StringUtil.errorBack("您输入了敏感词汇,请慎重操作!", ""));
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
}
}
System.out.println("普通表单");

chain.doFilter(request, response);

}
...全文
323 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifengquan163 2013-07-17
  • 打赏
  • 举报
回复
我也遇到过这样的问题。我现在还没有解决呢。使用multipart/form-data提交的数据经过过滤器到了action就得不到数据了。我现在的做法是在过滤器doFilter中加入 //检查输入请求是否为 multipart表单数据 boolean isMultipart = ServletFileUpload.isMultipartContent(request); try { if (isMultipart == true&&key==null) { //为该请求创建一个DiskFileItemFactory对象,通过它来解析请求 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //将所有的表单项目都保存到List中 List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> itr = items.iterator(); //循环list,取得表单项 while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); //检查当前项目是普通表单项目还是文件。 if (item.isFormField()) {//如果是普通表单项目,显示表单内容。 String fieldName = item.getFieldName(); if (fieldName.equals("key" )){ //对应form表单中type="text" name="name" System. out .println("key:" + item.getString()); //显示表单内容 key=item.getString(); } if (fieldName.equals("realName" )){ //对应form表单中type="text" name="name" request.setAttribute("realName", item.getString()); System. out .println("realName:" + item.getString()); //显示表单内容 } if (fieldName.equals("sex" )){ //对应form表单中type="text" name="name" request.setAttribute("sex", item.getString()); System. out .println("sex:" + item.getString()); //显示表单内容 } } else {//如果是文件 if (item.getFieldName().equals("file" )){ //如果上传文件的file的name为" filecer" request.setAttribute("file", item.getString()); System. out .println("file:" + item.getString()); //显示表单内容 } } } } 这样可以得到请求体你们的文本参数,然后通过request.setAttribute再放到请求里面。但是对于图片文件我却不知道怎么处理了。因为没有加过滤器之前我的图片是通过servlet上上传的现在包了一个过滤器得到图片的文件流可是到了action里面file一直是null的。怎么办啊各位,给点思路咯
qh8569 2012-12-31
  • 打赏
  • 举报
回复
带上传文件的form,我想通过过滤器过滤一下 敏感词,只要用过滤器,还有没有其他的思路?
  • 打赏
  • 举报
回复
我也没碰过这种问题
liangtu 2012-12-29
  • 打赏
  • 举报
回复
没碰到过这样的问题
qh8569 2012-12-29
  • 打赏
  • 举报
回复
来个过路的也中啊。。
qh8569 2012-12-29
  • 打赏
  • 举报
回复
自己再次顶起。。。
qh8569 2012-12-29
  • 打赏
  • 举报
回复
来高手,帮看一下,,在线等啊。。。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧