我正在使用 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 为空重定向 - 常规和 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 调用设置多个参数?

请您参考如下方法:

& 是 XML 中的一个特殊字符,表示 entity 的开始。像 &, < 等。XML 解析器隐式地寻找名称 (amp, lt , 等) 和结尾 ;。但是,您并没有这样使用它,因此当 Web 浏览器的 XML 解析器意外遇到 = 时,它会感觉到它,使其成为非 well-formed XML。 .

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

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!