目的:所有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);        } uploadaction

解决方案 »

  1.   

    带上传文件的form,我想通过过滤器过滤一下 敏感词,只要用过滤器,还有没有其他的思路?
      

  2.   

    我也遇到过这样的问题。我现在还没有解决呢。使用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的。怎么办啊各位,给点思路咯