如何在 JSF 2 中进行 Web 过滤?

Posted

技术标签:

【中文标题】如何在 JSF 2 中进行 Web 过滤?【英文标题】:How do a web filter in JSF 2? 【发布时间】:2011-12-20 06:13:07 【问题描述】:

我创建了这个过滤器:

public class LoginFilter implements Filter 

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 

        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();

        if (session.getAttribute("authenticated") != null || req.getRequestURI().endsWith("login.xhtml")) 
            chain.doFilter(request, response);
         else 
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("login.xhtml");
            return;
        

    

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 

    

    @Override
    public void destroy() 
    

这是我的结构:

然后我在 web.xml 中添加过滤器:

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

过滤器正常工作,但一直给我这个错误:

"Was not possible find or provider the resource, login"

在那之后我的richfaces 不再起作用了。

我该如何解决?或者正确地创建一个网络过滤器?

【问题讨论】:

这是一个奇怪的错误信息。你是从其他语言翻译过来的吗?只是 HTTP 404 错误吗? 我做 BalusC,我来自巴西,所以葡萄牙语出现错误,您知道如何将 Eclipse 更改为英语吗?所以我可以发布原始错误。 Eclipse 的默认语言取决于平台默认语言环境。因此,如果您的操作系统设置为葡萄牙语,那么 Eclipse 将继承此设置。但是您可以通过在eclipse.exe 上指定-nl [languagecode] 参数来覆盖它。例如:eclipse.exe -nl en 会将其设置为英文。 【参考方案1】:

您传递给 sendRedirect() 的任何相对路径 URL(即不以 / 开头的 URL)都将与当前请求 URI 相关。我了解登录页面位于http://localhost:8080/contextname/login.xhtml。所以,如果你例如访问http://localhost:8080/contextname/pages/user/some.xhtml,那么这个重定向调用实际上将指向http://localhost:8080/contextname/pages/user/login.xhtml,我认为它不存在。再次查看浏览器地址栏中的 URL。

要解决此问题,请改为重定向到与域相关的 URL,即以 / 开头的 URL。

res.sendRedirect(req.getContextPath() + "/login.xhtml");

【讨论】:

以上是关于如何在 JSF 2 中进行 Web 过滤?的主要内容,如果未能解决你的问题,请参考以下文章

如何从过滤器中读取 JSF 会话 bean?

在 Web 过滤器中访问会话范围的 JSF 托管 bean

如何显示/隐藏 jsf 组件

JSF 2 - 如何使用 JSF EL 从 web.xml 获取上下文参数值?

如何在过滤器中检索 FacesContext

带有 JSF 的 Servlet 过滤器