Filter过滤器及HttpServletRequestWrapper使用

   Filter过滤器是一种比较实用的东西,可以过滤不良信息,对提交来的信息进行处理。是RequestResponse之间的传输纽带。

具有重要作用,下面用一个Filter过滤器的程序来熟悉过滤器的使用。在提交的数据信息中,有一些信息需要过滤掉。例如,

一些暴力情色信息,我们可以通过过滤器来过滤掉这些信息,过滤器功能代码如下:

public class WordFilter implements Filter {
	// 非法字符数组
	private String words[];
	// 实现Filter接口init()方法
	@Override
	public void init(FilterConfig Config) throws ServletException {
		// 初始化非法字符数组
		words = new String[]{"色情","暴力"};
	}
	// 实现Filter接口doFilter()方法
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {	
    		// 设置request字符编码
            request.setCharacterEncoding(“gbk”);
            // 将request转换为重写后的Request对象
            request = new Request((HttpServletRequest) request);
            // 设置response字符编码
            response.setContentType("text/html; charset=gbk");
        }
		chain.doFilter(request, response);
	}
	// 实现Filter接口destroy()方法
	@Override
	public void destroy() {
		this.words = null;	}
	class Request extends HttpServletRequestWrapper{
		// 构造方法
		public Request(HttpServletRequest request) {
			super(request);
		}
		// 重写getParameter()方法
		@Override
		public String getParameter(String name) {
			// 返回过滤后的参数值
			return filter(super.getRequest().getParameter(name));
		}
		// 重写getParameterValues()方法
		@Override
		public String[] getParameterValues(String name) {
			// 获取所有参数值
			String[] values = super.getRequest().getParameterValues(name);
			// 通过循环对所有参数值进行过滤
			for (int i = 0; i < values.length; i++) {
				values[i] = filter(values[i]);
			}
			// 返回过滤后的参数值
			return values;
		}
	}
	/*过滤非法字符 */
	public String filter(String param){
		try {
			// 判断非法字符是否被初始化
			if(words != null && words.length > 0){
				// 循环替换非法字符
				for (int i = 0; i < words.length; i++) {
					// 判断是否包含非法字符
					if(param.indexOf(words[i]) != -1){
						// 将非法字符替换为"****"
						param = param.replaceAll(words[i], "####");
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return param;
	}
}

  这里采用了HttpServletRequestWrapper这个类,这个类是HttpServletRequest的包装类,对应的HttpServletResponseWrapperHttpServletResponse的包装类。在上面的代码中,Request类继承了HttpServletRequestWrapper类,重写了得到参数的方法,在重写的方法中调用自己写filter(String name)方法。从而可以实现过滤作用,当转发request对象到servlet时候,使用方法request.getParameter(name)来得到提交的参数值,从而调用了我们自己所写的方法,将不良信息进行过滤,从而达到我们的需求,Servlet代码如下:

public class MessageServlet extends HttpServlet {
	private static final long serialVersionUID = 6536812362207677194L;
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取标题
		String title = request.getParameter("title");
		// 获取内容
		String content = request.getParameter("content");
		// 将标题放置到request中
		request.setAttribute("title", title);
		// 将内容放置到request中
		request.setAttribute("content", content);
		// 转发到result.jsp页面
		request.getRequestDispatcher("index.jsp").forward(request, response);
		//forward转发是一次请求request值存在,sendRedirect重定向是两次请求两次回复request里面的参数全部丢失
		//转发到指定页面并且包括原有参数内容
	}

}

  最后将过滤后数据提交服务器,服务器处理过后再将结果通过JSP表现层显示给用户。

部分JSP代码如下:


<%

String tt = (String)request.getAttribute("title");

String ct = (String)request.getAttribute("content");

if(tt != null && !tt.isEmpty()){

out.println( tt );

}

if(ct != null && !ct.isEmpty()){

out.println( ct );

}

%>

<form action="MessageServlet" method="post">

<span class="tt">意见反馈</span>

<table border="0" width="500" align="center">

<tr>

<td align="right">标 题:</td>

<td><input type="text" name="title" size="30"></td>

</tr>

<tr>

<td align="right">内 容:</td>

<td>

<textarea rows="5" cols="40" name="content"></textarea>

</td>

</tr>

<tr>

<td align="center" colspan="2">

<input type="submit" value="提 交">

</td>

</tr>

</table>

</form>



你可能感兴趣的:(java,jsp,servlet,filter)