如何修复JSF中@WebFilter重定向后的空白页?

如何修复JSF中@WebFilter重定向后的空白页?,jsf,servlet-filters,Jsf,Servlet Filters,我正在使用JSF制作一个应用程序,如果用户没有登录,我想使用@WebFilter从每个页面(不包括login/register.xhtml)重定向到login.xhtml。问题是重定向之后,我看到的只是一个空白页 我认为它正在过滤所有资源,包括bootstrap.css,所以我使用了如下内容: if(req.getRequestURI().startsWith(req.getContextPath()+ResourceHandler.RESOURCE_标识符)){ 链式过滤器(请求、响应); 返

我正在使用JSF制作一个应用程序,如果用户没有登录,我想使用@WebFilter从每个页面(不包括login/register.xhtml)重定向到login.xhtml。问题是重定向之后,我看到的只是一个空白页

我认为它正在过滤所有资源,包括bootstrap.css,所以我使用了如下内容:

if(req.getRequestURI().startsWith(req.getContextPath()+ResourceHandler.RESOURCE_标识符)){
链式过滤器(请求、响应);
返回;
}
但它什么也没做

这是我的LoginFilter.java

@WebFilter(“*”)
公共类LoginFilter扩展了HttpFilter{
@注入
当前会话当前会话;
@凌驾
受保护的void doFilter(HttpServletRequest-req、HttpServletResponse-res、FilterChain-chain)抛出IOException、ServletException{
字符串currentPath=req.getContextPath()+req.getServletPath();
如果(!userisloged()){
如果(!currentPath.equals(“/app/register.xhtml”)&&!currentPath.equals(“/app/login.xhtml”))
res.sendRedirect(req.getContextPath()+“/login.xhtml”);
}
其他的
链式过滤器(要求、恢复);
}

有人能告诉我应该添加什么吗?

我认为您不应该编写自定义筛选器,因为JavaEE有一个用于身份验证和授权的内置接口。 您只需在
WEB-INF/WEB.xml
文件中进行配置即可。 以下是一个最小的项目:

sample-webapp ├── pom.xml └── src └── main ├── java ├── resources │   └── messages.properties └── webapp ├── pages │   ├── admin (restricted for ADMINISTRATORs only) │   │   └── admin.xhtml │   ├── dashboard.xhtml (available for all logged-in users) │   ├── protected.xhtml │   └── public (unrestricted pages) │   ├── login.xhtml │   └── register.xhtml ├── resources (unrestricted public resources) │   └── css │   └── style.css └── WEB-INF ├── faces-config.xml ├── jboss-web.xml └── web.xml 在login.xhtml中有一些要求

  • 该表格必须提交给
    j_security\u check
    action
  • 用户和密码字段必须是
    j_用户名
    j_密码
    ,如下所示:

#{msg['login.error']}
假设您有三种不同的用户类型

  • 未经验证(未登录的用户)
  • 用户(已验证)
  • 管理员(经过身份验证并具有特殊角色)

  • 未经身份验证的用户将访问
    login.xhtml
    register.xhtml
    否则,该用户将被重定向到登录表单
  • 经过身份验证的用户将访问
    webapp/pages
    下的所有页面,但
    webapp/pages/admin
    下的页面除外。如果用户尝试访问管理员页面,则会 得到禁止的回应
  • 管理员用户将访问每个页面

    • 我认为您不应该编写自定义过滤器,因为JavaEE有一个用于身份验证和授权的内置接口。 您只需在
      WEB-INF/WEB.xml
      文件中进行配置即可。 以下是一个最小的项目:

      sample-webapp ├── pom.xml └── src └── main ├── java ├── resources │   └── messages.properties └── webapp ├── pages │   ├── admin (restricted for ADMINISTRATORs only) │   │   └── admin.xhtml │   ├── dashboard.xhtml (available for all logged-in users) │   ├── protected.xhtml │   └── public (unrestricted pages) │   ├── login.xhtml │   └── register.xhtml ├── resources (unrestricted public resources) │   └── css │   └── style.css └── WEB-INF ├── faces-config.xml ├── jboss-web.xml └── web.xml 在login.xhtml中有一些要求

      • 该表格必须提交给
        j_security\u check
        action
      • 用户和密码字段必须是
        j_用户名
        j_密码
        ,如下所示:
      
      #{msg['login.error']}
      
      假设您有三种不同的用户类型

      • 未经验证(未登录的用户)
      • 用户(已验证)
      • 管理员(经过身份验证并具有特殊角色)

      • 未经身份验证的用户将访问
        login.xhtml
        register.xhtml
        否则,该用户将被重定向到登录表单
      • 经过身份验证的用户将访问
        webapp/pages
        下的所有页面,但
        webapp/pages/admin
        下的页面除外。如果用户尝试访问管理员页面,则会 得到禁止的回应
      • 管理员用户将访问每个页面

        • 我问这个问题已经有一段时间了,但我想可能有人会遇到这篇文章,所以我将在这里发布我的解决方案

          @WebFilter("*")
          public class LoginFilter extends HttpFilter {
              @Inject
              CurrentSession currentSession;
          
              @Override
              protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
          
                  //Resources
                  boolean isResource = req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");
          
                  if(isResource)
                      chain.doFilter(req, res);
          
          }
          

          我使用上下文路径和资源标识符检查它当前加载的文件是否是资源。

          我问这个问题已经有一段时间了,但我想可能有人会遇到这篇文章,所以我将在这里发布我的解决方案

          @WebFilter("*")
          public class LoginFilter extends HttpFilter {
              @Inject
              CurrentSession currentSession;
          
              @Override
              protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
          
                  //Resources
                  boolean isResource = req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");
          
                  if(isResource)
                      chain.doFilter(req, res);
          
          }
          

          我使用上下文路径和资源标识符来检查它当前加载的文件是否是资源。

          如果OP出于其他原因想使用过滤器,该怎么办?如果这不起作用,问题可能仍然存在。知道是什么导致了最初的问题吗?如果OP出于其他原因想使用过滤器,该怎么办d问题可能仍然存在。知道最初问题的原因吗?解决方案属于答案,而不是问题的编辑。请还原此问题。解决方案属于答案,而不是问题的编辑。请还原此问题