Filter过滤器是一种比较实用的东西,可以过滤不良信息,对提交来的信息进行处理。是Request和Response之间的传输纽带。
具有重要作用,下面用一个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的包装类,对应的HttpServletResponseWrapper是HttpServletResponse的包装类。在上面的代码中,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>