我有一个包含p:commandLink的页面,它在会话范围的辅助bean上调用一个非常简单的方法。 backing bean方法只是将消息记录到控制台并重定向到欢迎页面。
运行时,链接不执行任何操作。 h:消息中没有报告错误,服务器控制台上没有堆栈跟踪。但是,如果我在另一个页面上使用完全相同的代码,那么该链接可以正常工作。
页面之间的主要区别在于包含“死”链接的页面受登录过滤器保护(页面位于“受限”文件夹中),而包含“工作”链接的页面不在限制文件夹。
我已经在其他几个主题中听过关于不起作用的动作链接的建议。我没有嵌套表单或渲染问题等。我想知道登录过滤器是否可能对链接产生一些影响。
这是包含不起作用的链接的页面(它位于location:restricted / secret.xhtml)。我故意将内容最小化以消除其他潜在原因。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Restricted Page</title>
</h:head>
<h:body>
<h:form>
<h:messages />
<br/>
<p:commandLink action="#{loginBean.testMethod}" value="Test" />
</h:form>
</h:body>
</html>
这是支持bean中的方法(如果在不受保护的页面上使用完全相同的commandLink代码调用,它将起作用:
public String testMethod() {
logger.info("xxxxxxxxxxxxxx Test method called xxxxxxxxxxxxxx");
return("WelcomeMember.xhtml");
}
登录过滤器如下:
package com.mymato.coop;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/restricted/*")
public class AuthenticationFilter implements Filter {
@SuppressWarnings("unused")
private FilterConfig config;
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
if (((HttpServletRequest) req).getSession().getAttribute(
LoginBean.AUTH_KEY) == null) {
((HttpServletResponse) resp).sendRedirect("../login.xhtml");
} else {
chain.doFilter(req, resp);
}
}
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public void destroy() {
config = null;
}
}
为了将来参考,是否有一种调试此类问题的好方法?我现在已经遇到了几次死链接问题。它很难解决,因为它无声地失败了。至少如果有错误消息那么这将是一个线索。