在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL

Posted

技术标签:

【中文标题】在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL【英文标题】:Redirect JSF ajax request to an URL with request parameters in a servlet filter 【发布时间】:2013-11-29 10:08:17 【问题描述】:

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

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);
    

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

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

如果我添加第二个参数 "../login.xhtml?param1=noSession&amp;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】:

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

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

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

【讨论】:

以上是关于在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL的主要内容,如果未能解决你的问题,请参考以下文章

带有 JSF 的 Servlet 过滤器

JSF -- 过滤 javax.faces.resource 文本替换

JSF Servlet 模式/奇怪的请求

在 servlet 过滤器中向请求添加 HTTP 标头

从 servlet 过滤器重定向到 jsf 会返回未呈现为 html 的实际 jsf 代码

如何在 java Servlet 过滤器中更改传入 URL 并将请求重定向到新 URL [重复]