我正在使用 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¶m2=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 调用设置多个参数?
最佳答案
&
是 XML 中的一个特殊字符,表示 entity 的开始。像 &
, <
等。XML 解析器隐式地寻找名称 (amp
, lt
, 等) 和结尾 ;
。但是,您并没有这样使用它,因此当 Web 浏览器的 XML 解析器意外遇到 =
时,它会感觉到它,使其成为非 well-formed XML。 .
需要将XML特殊字符&
转义为实体&
。
redirectURLAjax = response.encodeRedirectURL(request.getContextPath()
+ "/faces/login.xhtml?param1=noSession&param2=val2");
关于ajax - 使用 servlet 过滤器中的请求参数将 JSF ajax 请求重定向到 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20010841/