如果使用Servlet的Filter过滤数据库中非法字符?

cs78799662 2010-07-31 05:20:33
我的数据库已经被插入了若干条存在非法字符的数据,请问如果使用Filter来过滤数据库中读取的每个字段?
以下是我通过文档写的代码但不知如何修改,如下:

package com.xjdnw.utility;


import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class Response2Filter implements Filter {

public void destroy() {
// TODO Auto-generated method stub

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {

HttpServletResponseWrapper2 response2 = new HttpServletResponseWrapper2((HttpServletResponse) response);
chain.doFilter(request, response2);

PrintWriter out = response.getWriter();
out.println(response2.toString());

response2.setHeader("Cache-Control", "no-cache");
response2.setHeader("Pragma", "no-cache");
response2.setHeader("X-UA-Compatible", "IE=EmulateIE7");
response2.setHeader("Content-Type", "text/html; charset=UTF-8");
response2.setDateHeader("Expires", -1);
}

public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

private class HttpServletResponseWrapper2 extends HttpServletResponseWrapper {
private StringWriter stringWriter;

public HttpServletResponseWrapper2(HttpServletResponse response) {
super(response);

// TODO Auto-generated constructor stub
stringWriter = new StringWriter();
}

public PrintWriter getWriter() {

return new PrintWriter(stringWriter);
}

public String toString() {

return stringWriter.toString();
}
}


}


...全文
200 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs78799662 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dr_lou 的回复:]
一般过滤都是防止写入的,不知道你的需求是什么?
如果想删除,sql语句即可。
如果数据库存的是过滤表,启动时读入内存。
[/Quote]
不太明白你说的最后一句
dr_lou 2010-08-01
  • 打赏
  • 举报
回复
一般过滤都是防止写入的,不知道你的需求是什么?
如果想删除,sql语句即可。
如果数据库存的是过滤表,启动时读入内存。
cs78799662 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fuweilzp 的回复:]
你这样试试行不行!
你查询出来的数据在查询后,循环取出来一次,将你所有的非法字符处理下就行了
我记得我那个程序貌似就是这么写的!写过滤器貌似我还没写过!
[/Quote]
但是目前我有上百个页面
这样做是在是效率太低
fuweilzp 2010-08-01
  • 打赏
  • 举报
回复
你这样试试行不行!
你查询出来的数据在查询后,循环取出来一次,将你所有的非法字符处理下就行了
我记得我那个程序貌似就是这么写的!写过滤器貌似我还没写过!
fuweilzp 2010-08-01
  • 打赏
  • 举报
回复
要过滤数据库到页面的一些敏感字符是吧?
我貌似做过一个类似的项目,我找找看吧,找到发你!
cs78799662 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fuweilzp 的回复:]
这是我写的一个filter,过滤貌似不错,没出现过乱码!
ackage com.yourcompany.gbk;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import ja……
[/Quote]
谢谢了,但是解决页面编码问题,我过滤从数据库到页面的敏感字符
fuweilzp 2010-08-01
  • 打赏
  • 举报
回复
这是我写的一个filter,过滤貌似不错,没出现过乱码!
ackage com.yourcompany.gbk;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharsetFilter implements Filter{
protected String encoding = null;



protected FilterConfig filterConfig = null;




protected boolean ignore = true;




public void destroy() {

this.encoding = null;

this.filterConfig = null;

}



public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain)

throws IOException, ServletException {

// Conditionally select and set the character encoding to be used

if (ignore || (request.getCharacterEncoding() == null)) {

String encoding = selectEncoding(request);

if (encoding != null)

request.setCharacterEncoding(encoding);

}

// Pass control on to the next filter

chain.doFilter(request, response);

}



public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;

this.encoding = filterConfig.getInitParameter("encoding");

String value = filterConfig.getInitParameter("ignore");

if (value == null)

this.ignore = true;

else if (value.equalsIgnoreCase("true"))

this.ignore = true;

else if (value.equalsIgnoreCase("yes"))

this.ignore = true;

else

this.ignore = false;

}



protected String selectEncoding(ServletRequest request) {

return (this.encoding);

}
}
web-xml配置:
<filter>

<filter-name>Encoding</filter-name>
<filter-class>com.yourcompany.gbk.CharsetFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
基本上可以了
cs78799662 2010-08-01
  • 打赏
  • 举报
回复
自己顶
cs78799662 2010-07-31
  • 打赏
  • 举报
回复
自个顶下
tuoxie119 2010-07-31
  • 打赏
  • 举报
回复
学习,帮顶。
xieruilin 2010-07-31
  • 打赏
  • 举报
回复
用sprint里的 置后通知,在获取数据后过滤。
在filter里面不太行吧,因为都是页面提交时过滤,响应时没过滤哦。
cs78799662 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java5237 的回复:]
up 帮顶一下 数据库里已经存入了 可不可以把它放到js里 在js里进行处理之后放到页面中去
[/Quote]
这也是个办法,但是效率不高啊
我有上千个字段需要这样处理
java5237 2010-07-31
  • 打赏
  • 举报
回复
up 帮顶一下 数据库里已经存入了 可不可以把它放到js里 在js里进行处理之后放到页面中去

67,513

社区成员

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

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