将JSF ajax请求重定向到servlet过滤器中具有请求参数的URL

时间:2013-11-15 21:23:46

标签: ajax xml jsf-2 servlet-filters http-request-parameters

我正在使用JSF2.2并配置了servlet过滤器。 Filter中的部分代码可以工作:

HttpServletResponse response = (HttpServletResponse) resp;
if (userSession == null) {

    redirectURLRegular = response.encodeRedirectURL("../login.xhtml?param1=noSession");
    redirectURLAjax = response.encodeRedirectURL(request.getContextPath()
                + "/faces/login.xhtml?param1=noSession");

else{
    chain.doFilter(req, resp);
    return;

if (isAJAXRequest(request)) {

        StringBuilder sb = new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>
            <partial-response><redirect url=\"").append(redirectURLAjax)
                .append("\"></redirect></partial-response>");
        response.setHeader("Cache-Control", "no-cache");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/xml");

        PrintWriter pw = response.getWriter();
        pw.println(sb.toString());
        pw.flush();

    } else { 
        response.sendRedirect(redirectURLRegular);
    }

如果session为null重定向 - 常规和AJAX都会发生。在下一页(login.xhtml,requestScoped)中我可以通过

获取bean中的参数值(param1)
@ManagedProperty("#{param.param1}")
private String param1;

如果我添加第二个参数"../login.xhtml?param1=noSession&param2=val2" - 常规请求工作(重定向发生并看到两个参数)但AJAX请求不起作用(没有重定向,没有任何反应)。这是Firebug报告:

XML Parsing Error: not well-formed Location: moz-nullprincipal:{4584d37a-e799-43db-8379-b0451edca95c} Line Number 1, Column 120:

..."/admin/faces/login.xhtml?param1=noSession&param2=val2"></redirect></partial-r...
...-------------------------------------------------^

这是如何引起的,我们如何在过滤器中为AJAX调用设置多个参数?

1 个答案:

答案 0 :(得分:3)

&是XML中的一个特殊字符,表示entity的开头,如&amp;&lt;等.XML解析器隐式查找名称( amplt等)和结尾;。但是,你并没有这样使用它,因此webbrowser的XML解析器在意外遇到=时感觉到它,使其变为非well-formed XML

您需要将XML特殊字符&转义为实体&amp;

redirectURLAjax = response.encodeRedirectURL(request.getContextPath()
            + "/faces/login.xhtml?param1=noSession&amp;param2=val2");
相关问题