【发布时间】:2013-03-11 15:05:39
【问题描述】:
我的h:commandLink 中的操作未触发时遇到问题。我查看了 BalusC 非常 useful post 的原因可能是什么,我能够将其追溯到第 11 号:
确保同一请求-响应链中没有过滤器或 Servlet 以某种方式阻止了对 FacesServlet 的请求。
似乎有一个过滤器导致了问题 - 我通过删除过滤器并重试发现了这个问题。不幸的是我没有写过滤器,更不幸的是我对它们知之甚少。所以我想知道是否有一种好方法可以让这个过滤器不适用于h:commandLink 动作触发?我看到doFilter() 方法传递了以下参数:
ServletRequest request
ServletResponse response
FilterChain chain
所以我的第一直觉是看看是否有我可以在其中一个参数中使用的东西,这些参数会告诉我这是来自我的h:commandLink 的点击。如果是这样,我将绕过doFilter() 方法中的所有代码。不确定这是否可能,或者是一种好的方法,但这是首先想到的。
但我也想在这里问一下是否有一种体面的方法来处理这个问题?或者这是否表明过滤器本身存在某种问题,我可能需要考虑修复?任何类似的信息都会很有用。
顺便说一句,我知道我可能可以使用actionListener 来触发我的 bean 中的方法,但是,据我了解,这是不好的设计,所以我想避免这种情况。
【问题讨论】:
-
这是一个非常罕见的原因,表明相关过滤器中可能存在严重错误或配置错误。它是哪个过滤器?第三方的还是内部的?你能说出它的全限定类名吗?你能告诉/问它的工作是什么吗?
-
有问题的过滤器是由同行在内部编写的。他的解释如下:“它将长网址重定向到匹配的短网址并将这些短网址转发到真正的长网址”。当我删除过滤器时,要访问页面,我必须转到更长的 url,例如 /status/app/page.xhtml。有了过滤器,这个 url 就变成了 /status/page/ - 所以听起来我有一些调试要做,我想现在是我学习过滤器的时候了 - 一旦我有更好的信息或解决方案
-
听起来好像他试图以与 JSF2 完全兼容的方式重新发明 PrettyFaces 已经发明的东西。您可能想考虑使用它来获得更强大的实现,而不是浪费时间重新发明轮子,同时对问题的了解不足。
-
我的调试似乎表明当单击
h:commandLink时,过滤器将其视为来自“长 URL”的请求。当这种情况发生时,链会被使用生成的“短 URL”的重定向中断:httpResponse.setHeader("Location", shortRedirectUrl);所以我今天会问他是否考虑过 PrettyFaces,如果我的利益相关者可以接受,我会检查自己实施这个 - 感谢信息!
标签: jsf action servlet-filters