Jsf xml文档中的授权筛选器结果没有样式信息

Jsf xml文档中的授权筛选器结果没有样式信息,jsf,servlet-filters,Jsf,Servlet Filters,我正在使用JSF2.2和AWS构建一个登录应用程序。到目前为止,我已经让它工作了,但现在我正在尝试使用servlet过滤器实现授权过滤器。问题是,每当我在将页面上传到AWS elastic bean后启用过滤器并尝试测试页面时,我都会收到一个错误“此XML文件似乎没有任何与之相关的样式信息。文档树如下图所示。”我搜索了答案,但找不到任何具体的内容。我尝试删除过滤器,但问题仍然存在,我将/*.xthml作为facelet url模式,并将其更改为*.xhtml,这似乎可以解决问题,但在尝试使用过滤

我正在使用JSF2.2和AWS构建一个登录应用程序。到目前为止,我已经让它工作了,但现在我正在尝试使用servlet过滤器实现授权过滤器。问题是,每当我在将页面上传到AWS elastic bean后启用过滤器并尝试测试页面时,我都会收到一个错误“此XML文件似乎没有任何与之相关的样式信息。文档树如下图所示。”我搜索了答案,但找不到任何具体的内容。我尝试删除过滤器,但问题仍然存在,我将/*.xthml作为facelet url模式,并将其更改为*.xhtml,这似乎可以解决问题,但在尝试使用过滤器时,出现了相同的错误

这是我的过滤器

public class AuthenticationFilter implements Filter {

public AuthenticationFilter() {
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);

    //User user = (session != null) ? session.getAttribute("username") : null;
    String loginURI = request.getContextPath() + "/login.xhtml";

    boolean loginRequest = request.getRequestURI().equals(loginURI);
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);

    if (session.getAttribute("username") != null || loginRequest || resourceRequest) {
        chain.doFilter(request, response);
    } else {
        response.sendRedirect(loginURI);
    }
    String uri = ((HttpServletRequest)request).getRequestURI();


    // session = ActionContext.getContext().getSession();

    if ( uri.indexOf("/styles") > 0){
        chain.doFilter(request, response);
    }
    else if( uri.indexOf("/images") > 0){
        chain.doFilter(request, response);
    }
    else if( uri.indexOf("/js") > 0){
        chain.doFilter(request, response);
    }
    else if (session.getAttribute("username") != null) {
        chain.doFilter(request, response);
    }
    else {
        ((HttpServletResponse)response).sendRedirect(((HttpServletRequest)request).getContextPath() + "/login.xhtml");
    }
}

@Override
public void destroy() {

}
}

和web.xml

<servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
  <description>State saving method: 'client' or 'server' (=default). See JSF        Specification 2.5.2</description>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>client</param-value>
</context-param>
<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
  <param-value>resources.application</param-value>
</context-param>
<listener>
  <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<filter>
  <filter-name>AuthFilter</filter-name>
  <filter-class>hello.AuthenticationFilter</filter-class>
 <init-param>
    <param-name>test-param</param-name>
    <param-value>This parameter is for testing.</param-value>
 </init-param>
</filter>
<filter-mapping>
  <filter-name>AuthFilter</filter-name>
  <url-pattern>/User/*.xhtml</url-pattern>
</filter-mapping>

Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
*.xhtml
状态保存方法:“客户端”或“服务器”(=默认值)。参见JSF规范2.5.2
javax.faces.STATE_保存方法
客户
javax.servlet.jsp.jstl.fmt.localizationContext
资源.应用
com.sun.faces.config.ConfigureListener
AuthFilter
hello.AuthenticationFilter
测试参数
此参数用于测试。
AuthFilter
/User/*.xhtml

我将login.xhtml和register.xhtml直接放在WebContent文件夹中,该文件夹应该有访问权限,并且在/User目录中有一个welcome.xhtml页面,我正试图限制对该页面的访问权限。我不确定还包括哪些内容,因此如果您需要其他内容,我可以提供。

您确定过滤器是罪魁祸首吗?还有,为什么你不让你的资源根路径建立在那里并被引用呢?我不完全确定,但一旦我删除了过滤器并将其从web.xml中删除,一切都正常工作,所以我猜这就是问题所在。关于资源,我认为自从我在Eclipse中通过AWS SDK创建了一个web应用程序模板以来,资源就已经存在了。我没有手动添加。但是你可以按照你的意愿操作文件,是吗?是的,一切都很好。但我确实遇到了一个问题:描述资源路径位置类型类路径条目myApp/WebContent/WEB-INF/lib/javax.servlet-api-3.0.1.jar将不会导出或发布。可能会导致运行时ClassNotFoundException。myApp P/myApp类路径依赖验证程序消息。这完全不相关,但我想我会发布它。您的筛选器URL模式是非法的(只需使用
/User/*
),并且您似乎不了解筛选器是如何工作的,因为您在同一个请求中多次调用
doFilter()
和/或
sendRedirect()
。从这里开始: