目的:所有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
我的过滤器代码 如下:
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
//检查输入请求是否为 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的。怎么办啊各位,给点思路咯