Filter过滤器及HttpServletRequestWrapper使用

来源:互联网 发布:弱电网络系统图 编辑:程序博客网 时间:2024/05/16 05:49

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

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

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

public class WordFilter implements Filter {// 非法字符数组private String words[];// 实现Filter接口init()方法@Overridepublic void init(FilterConfig Config) throws ServletException {// 初始化非法字符数组words = new String[]{"色情","暴力"};}// 实现Filter接口doFilter()方法@Overridepublic 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()方法@Overridepublic void destroy() {this.words = null;}class Request extends HttpServletRequestWrapper{// 构造方法public Request(HttpServletRequest request) {super(request);}// 重写getParameter()方法@Overridepublic String getParameter(String name) {// 返回过滤后的参数值return filter(super.getRequest().getParameter(name));}// 重写getParameterValues()方法@Overridepublic 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>



0 0
原创粉丝点击