当前位置: 首页 > 知识库问答 >
问题:

在servlet筛选器中将JSF ajax请求重定向到具有请求参数的URL

元昊苍
2023-03-14

我正在使用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);
    }
@ManagedProperty("#{param.param1}")
private String param1;

如果我添加第二个param“../login.xhtml?param1=nosession&param2=val2”-常规请求可以工作(发生重定向并看到两个param),但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...
...-------------------------------------------------^

这是如何造成的,我们如何在filter中为AJAX调用设置多个参数?

共有1个答案

浦出野
2023-03-14

&是XML中的一个特殊字符,表示诸如&;等实体的开始。XML解析器隐式地查找名称(amp等)和结尾。但是,您并没有这样使用它,因此当WebBrowser的XML解析器意外地遇到=时,它感觉到了它,这使得它不是格式良好的XML。

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

redirectURLAjax = response.encodeRedirectURL(request.getContextPath()
            + "/faces/login.xhtml?param1=noSession&amp;param2=val2");
 类似资料:
  • 我正在编写一个servlet过滤器。我想添加错误并将响应发送回请求来自的页面。 我知道我们可以将反应重定向为 提前致谢

  • 我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定

  • 我们的整个网站将通过https提供服务。我在每条路线上都有“https”。但是,如果他们试图通过http将其重定向到https,我该如何将其重定向到https?

  • 问题内容: 在我的应用程序中,我想应用一个过滤器,但我不希望所有请求都必须转到该过滤器。 这将是一个性能问题,因为我们已经有了其他一些过滤器。 我希望过滤器仅适用于HTTP POST请求。有什么办法吗? 问题答案: 尚无此功能。一个拥有适用于所有的HTTP方法的开销。但是,如果您的代码中包含一些逻辑,这些逻辑会产生开销,那么您不应该将该逻辑应用于不需要的HTTP方法。 这是示例代码:

  • 问题内容: 显然,请求参数的顺序未保留在Tomcat Servlet容器中(对于Google,似乎其他容器也存在相同的问题)。 这似乎是非常错误的。 如何从HttpServletRequest恢复请求参数的实际顺序? *对于那些认为请求参数顺序无关紧要的人来说, *编辑 BTW之间是有区别的: 和 因此,顺序对于重复的请求参数确实很重要(幸运的是Java确实处理了此权利)。 问题答案: 通常,您不

  • 我将spring saml扩展与Apache2.2+Tomcat7.0+OKTA(IdP)一起使用。securitycontext.xml如下所示: MetadataGeneratorFilter: 谢谢 奈良 HTTP请求转储: