在 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&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¶m2=val2"></redirect></partial-r...
...-------------------------------------------------^
这是怎么引起的,我们如何在过滤器中为 AJAX 调用设置多个参数?
【问题讨论】:
【参考方案1】:&amp;
是 XML 中的一个特殊字符,表示 entity 的开头,例如 &amp;
、&lt;
等。XML 解析器正在隐式查找名称(amp
、lt
、等)和结尾;
。但是,您并没有这样使用它,因此当 webbrowser 的 XML 解析器意外遇到 =
时,它会感觉到它,使其不是well-formed XML。
您需要将 XML 特殊字符 &amp;
转义为实体 &amp;
。
redirectURLAjax = response.encodeRedirectURL(request.getContextPath()
+ "/faces/login.xhtml?param1=noSession&param2=val2");
【讨论】:
以上是关于在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL的主要内容,如果未能解决你的问题,请参考以下文章
JSF -- 过滤 javax.faces.resource 文本替换