Servlet---请求封装器

来源:互联网 发布:java数据结构和算法 编辑:程序博客网 时间:2024/06/15 04:30

    如果前端传入的字符串中包含特殊字符。例如HTML标签 <a href="http://www.baidu.com">百度</a>,传入这种参数会导致后台吧字符串当成了HTML链接。为了避免这种情况的发生,需要过滤用户输入的字符串。
    从Request中可以用 getParameter()方法获取参数,可以将获得的参数进行处理,但是Request却没有类似“setParameter()”的方法。当然,也可以直接重写getParameter,但是就需要接口中的所有方法都重写,非常麻烦。
    HttpServletRequestWrapper类使用了HttpServletRequest接口,并实现了所有的方法,使用时只需集成该类,并重写需要的特定方法即可。

WrapperTest继承自HttpServletRequestWrapper,并重写了getParameter,构造函数传入的是真正的Request,可以使用getRequest()获取它,之后可以通过过滤器用WrapperTest替换HttpServletRequest

public class WrapperTest extends HttpServletRequestWrapper {    // 传入真正的request    public WrapperTest(HttpServletRequest request) {        super(request);    }    // 处理从request中获得的参数    public String getParameter(String name) {        String result = this.getRequest().getParameter(name);        // 使用StringEscapeUtils过滤特殊字符        return StringEscapeUtils.escapeHtml3(result);    }}

用WrapperTest替换HttpServletRequest,doFilter()中将WrapperTest传入,之后的Servlet就会从WrapperTest中获得参数,而不是从HttpServletRequest中获得。

public class WrapperFilter implements Filter {    public void doFilter(ServletRequest arg0, ServletResponse arg1,            FilterChain arg2) throws IOException, ServletException {        // 创建新的Request        HttpServletRequestWrapper requestWrapper = new WrapperTest((HttpServletRequest)arg0);        // 用WrapperTest对象替换HttpServletRequest,使getParameter具有过滤的功能        arg2.doFilter(requestWrapper, arg1);    }    public void init(FilterConfig arg0) throws ServletException {}    public void destroy() {}}

直接访问Servlet(http://localhost:8080/Test/hello?html=<a href='http://www.baidu.com>百度</a>

        String html =  req.getParameter("html");        System.out.println("#"+html);        结果:        &lt;a href='http://www.baidu.com'&gt;百度&lt;/a&gt;
原创粉丝点击