正文

过滤器的进一步使用--整站过滤2006-12-19 15:14:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ggbm/21711.html

分享到:

  也是一个朋友要求帮忙,在整个网站的访问期间要过滤掉例如“法轮功”的非法字符,所以帮忙写了个。一下是一个测试的源程序。tomcat 5.0.28 ,  windows 2000 sp4 , jdk1.4中测试通过 Eclipse下工程源码下载(将文件后面的.jpg去掉即可,是个压缩包) /** * @author    李国庆 * @company   leemenz (C) copyright * @time      Dec 18, 2006  2:08:18 PM * @version   1.0.0.0 * @package   com */package com; import java.io.IOException;import java.io.PrintWriter; 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.HttpServletRequest; /** * @author Administrator *  * 这个过滤器用来过滤黑名单中的用户不能留言 *  */public class NoteFilter implements Filter {  private FilterConfig config = null;  private String blackList = null;  /*  * (non-Javadoc)  *   * @see javax.servlet.Filter#destroy()  */ public void destroy() {  // TODO Auto-generated method stub  config = null; }  /*  * (non-Javadoc)  *   * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,  *      javax.servlet.ServletResponse, javax.servlet.FilterChain)  */ public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) throws IOException, ServletException {  // TODO Auto-generated method stub  String username = request.getParameter("username");  if (username != null)   username = new String(request.getParameter("username").getBytes(     "ISO8859-1"), "GB2312");  if (username != null && username.indexOf(blackList) != -1) {   response.setContentType("text/html;charset=GB2312");   PrintWriter out = response.getWriter();   out.println("<html><head></head><body>");   out.println("<h1>对不起," + username + ",您没有留言的权限!");   out.println("</h1></body></html>");   out.flush();   return;  }   long before = System.currentTimeMillis();  config.getServletContext()    .log("NoteFilter:before call chain.Filter();");  chain.doFilter(request, response);  config.getServletContext().log("NoteFilter:after call chain.Filter();");  long end = System.currentTimeMillis();  String name = "";  if (request instanceof javax.servlet.http.HttpServletRequest) {   name = ((HttpServletRequest) request).getRequestURI();  }  config.getServletContext().log(    "NoteFilter " + name + " : " + (end - before) + " ms"); }  /*  * (non-Javadoc)  *   * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)  */ public void init(FilterConfig arg0) throws ServletException {  // TODO Auto-generated method stub  this.config = arg0;  this.blackList = config.getInitParameter("blackList"); } } /** * @author    李国庆 * @company   leemenz (C) copyright * @time      Dec 18, 2006  2:08:18 PM * @version   1.0.0.0 * @package   com */package com; import java.io.IOException; import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /* *测试页面 */public class NoteServlet extends HttpServlet {  public static final String CONTENT_TYPE = "text/html;charset=GB2312";  /**  * Constructor of the object.  */ public NoteServlet() {  super(); }  /**  * Destruction of the servlet. <br>  */ public void destroy() {  super.destroy(); // Just puts "destroy" string in log  // Put your code here }  /**  * The doDelete method of the servlet. <br>  *   * This method is called when a HTTP delete request is received.  *   * @param request  *            the request send by the client to the server  * @param response  *            the response send by the server to the client  * @throws ServletException  *             if an error occurred  * @throws IOException  *             if an error occurred  */ public void doDelete(HttpServletRequest request,   HttpServletResponse response) throws ServletException, IOException {   // Put your code here }  /**  * The doGet method of the servlet. <br>  *   * This method is called when a form has its tag value method equals to get.  *   * @param request  *            the request send by the client to the server  * @param response  *            the response send by the server to the client  * @throws ServletException  *             if an error occurred  * @throws IOException  *             if an error occurred  */ public void doGet(HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {   response.setContentType(CONTENT_TYPE);  ServletOutputStream out = response.getOutputStream();  out    .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");  out.println("<HTML>");  out.println("  <HEAD><TITLE>留言簿</TITLE></HEAD>");  out.println("  <BODY>");   String name = request.getParameter("username");  String content = request.getParameter("content");   if (name != null)   name = new String(name.getBytes("ISO-8859-1"), "GB2312");  if (content != null)   content = new String(content.getBytes("ISO-8859-1"), "GB2312");   if (content != null)   out.println("<p> " + name + "的留言为:" + content);   out.println("<form method=\"post\" action=\""    + request.getContextPath() + "/servlet/NoteServlet\">");  out.println("<b>姓名:</b><input type=\"text\" name=\"username\"></br>");  out    .println("<b>内容:</b><textArea name=\"content\" row=\"5\" cols=\"20\" wrap></textArea></br>");  out.println("<input type=\"submit\" name=\"提交\" value=\"提交\">");  out.println("<input type=\"reset\" name=\"重填\" value=\"重填\"></br>");  out.println("  </BODY>");  out.println("</HTML>");  out.flush();  out.close(); }  /**  * The doPost method of the servlet. <br>  *   * This method is called when a form has its tag value method equals to  * post.  *   * @param request  *            the request send by the client to the server  * @param response  *            the response send by the server to the client  * @throws ServletException  *             if an error occurred  * @throws IOException  *             if an error occurred  */ public void doPost(HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {   this.doGet(request, response); }  /**  * Initialization of the servlet. <br>  *   * @throws ServletException  *             if an error occure  */ public void init() throws ServletException {  // Put your code here } } /** * @author    李国庆 * @company   leemenz (C) copyright * @time      Dec 18, 2006  3:58:53 PM * @version   1.0.0.0 * @package   com */package com; import java.io.IOException; import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper; /** * @author Administrator *  这个类继承HttpServletResponseWrapper ,并重写相应的方法 */public class ReplaceServletWapper extends HttpServletResponseWrapper {  private ReplaceTextStream tpStream;  /**  * @param arg0  */ public ReplaceServletWapper(HttpServletResponse arg0, String searchText,   String replaceText) throws IOException {  // TODO Auto-generated constructor stub  super((HttpServletResponse)arg0);  tpStream = new ReplaceTextStream(arg0.getOutputStream(),searchText,replaceText); }  public ServletOutputStream getOutputStream() throws IOException {  return tpStream; } } /** * @author    李国庆 * @company   leemenz (C) copyright * @time      Dec 18, 2006  2:08:18 PM * @version   1.0.0.0 * @package   com */package com; 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;import javax.servlet.http.HttpServletResponse; /** * @author Administrator *  * 这个类用来过滤留言或者是用户名中的非法内容 *  */public class ReplaceTextFilter implements Filter {  private FilterConfig config;  private String searchStr;  private String replaceStr;  /*  * (non-Javadoc)  *   * @see javax.servlet.Filter#destroy()  */ public void destroy() {  // TODO Auto-generated method stub  config = null; }  /*  * (non-Javadoc)  *   * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,  *      javax.servlet.ServletResponse, javax.servlet.FilterChain)  */ public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) throws IOException, ServletException {  // TODO Auto-generated method stub  ReplaceServletWapper myWrappered = new ReplaceServletWapper(    (HttpServletResponse) response, searchStr, replaceStr);  config.getServletContext().log(    "ReplaceTextFilter : before called doFilter");  chain.doFilter(request, myWrappered);  config.getServletContext().log(    "ReplaceTextFilter : after called doFilter");  myWrappered.getOutputStream().close(); }  /*  * (non-Javadoc)  *   * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)  */ public void init(FilterConfig arg0) throws ServletException {  // TODO Auto-generated method stub  this.config = arg0;  this.searchStr = config.getInitParameter("search");  this.replaceStr = config.getInitParameter("replace"); } } /** * @author    李国庆 * @company   leemenz (C) copyright * @time      Dec 18, 2006  3:33:51 PM * @version   1.0.0.0 * @package   com */package com; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream; import javax.servlet.ServletOutputStream; /** * @author Administrator *  这个类继承ServletOutputStream ,并重写相应的方法 */public class ReplaceTextStream extends ServletOutputStream {  private OutputStream intStream;  private ByteArrayOutputStream baStream;  private boolean closed = false;  private String newStr;  private String oldStr;  /**  *   */ public ReplaceTextStream(OutputStream outStream, String strSearch,   String strReplace) {  // TODO Auto-generated constructor stub  intStream = outStream;  baStream = new ByteArrayOutputStream();  oldStr = strSearch;  newStr = strReplace; }  /*  * (non-Javadoc)  *   * @see java.io.OutputStream#write(int)  */ public void write(int b) throws IOException {  // TODO Auto-generated method stub  baStream.write(b); }  /**  * 重写方法  */ public void println(String s) throws IOException {  s = s + "\n";  byte[] bs = s.getBytes();  baStream.write(bs); }  /**  * 重写方法  */ public void close() throws IOException {  if (!closed) {   processStream();   intStream.close();   closed = true;  } }  /**  * 重写方法  */ public void flush() throws IOException {  if (baStream.size() != 0) {   processStream();   baStream = new ByteArrayOutputStream();  } }  /**  * 重写 processStream 方法  *   * @throws IOException  */ public void processStream() throws IOException {  intStream.write(replaceContent(baStream.toByteArray())); }  /**  * 替换所有的目的词语  *   * @param inBytes  * @return  */ public byte[] replaceContent(byte[] inBytes) {  String retVal = "";  String tpString = new String(inBytes);  String srchString = (new String(inBytes)).toLowerCase();  int endBody = srchString.indexOf(oldStr);  if (endBody != -1) {   retVal = tpString.replaceAll(oldStr, newStr);  } else   retVal = tpString;  return retVal.getBytes(); } } <?xml version="1.0" encoding="GB2312"?><web-app version="2.4"  xmlns="http://java.sun.com/xml/ns/j2ee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  <!--  -->   <filter>  <filter-name>NoteFilter</filter-name>  <filter-class>com.NoteFilter</filter-class>  <init-param>   <param-name>blackList</param-name>   <param-value>毛泽东</param-value>  </init-param> </filter>  <filter-mapping>  <filter-name>NoteFilter</filter-name>  <url-pattern>/servlet/NoteServlet</url-pattern> </filter-mapping>  <filter>  <filter-name>ReplaceTextFilter</filter-name>  <filter-class>com.ReplaceTextFilter</filter-class>  <init-param>   <param-name>search</param-name>   <param-value>法轮功</param-value>  </init-param>  <init-param>   <param-name>replace</param-name>   <param-value>邪教</param-value>  </init-param> </filter>   <filter-mapping>  <filter-name>ReplaceTextFilter</filter-name>  <url-pattern>/servlet/NoteServlet</url-pattern> </filter-mapping>   <servlet>    <servlet-name>NoteServlet</servlet-name>    <servlet-class>com.NoteServlet</servlet-class>  </servlet>   <servlet-mapping>    <servlet-name>NoteServlet</servlet-name>    <url-pattern>/servlet/NoteServlet</url-pattern>  </servlet-mapping></web-app> 另外,要看到日志的输出信息,必须确保在server.xml文件中有如下代码:<Logger className="org.apache.catalina.logger.FileLogger"              prefix="catalina_log." suffix=".txt"              timestamp="true"/> enjoy it!!!   :)

阅读(3047) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册