Servlet过滤器不响应给定的URL模式

时间:2014-08-27 07:13:10

标签: jsf-2 servlet-filters url-pattern

我有一个JSF Web应用程序,其中驻留在目录web下的所有页面都需要受到保护以免受不正常使用,即用户应该在会话中访问这些页面。我正在使用过滤器来验证这些页面的会话。这些页面可通过以下URL访问:/contextRoot/web/download.xhtml或/contextRoot/web/sign/upload.xhtml。而位于Web目录之外或其他目录中的其他页面不需要通过会话验证过滤器。我的过滤器就像:

@WebFilter(filterName = "AuthenticationFilter", urlPatterns={"/web/*"}, dispatcherTypes   = {DispatcherType.REQUEST})

public class AuthenticationFilter implements Filter {

private static final boolean debug = true;

private FilterConfig filterConfig = null;

public AuthenticationFilter() {
}


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

    if (debug) {
        log("AuthenticationFilter:doFilter()");
    }
    HttpSession session = ((HttpServletRequest) request).getSession(false);
    if (session == null || session.getAttribute("username") == null) {
        System.out.println("Your Session Not Active. You are redirected.");
        //((HttpServletResponse) response).sendRedirect("home.xhtml");
    } else {
        System.out.println("Your Session is active. username : " + session.getAttribute("username"));
    }

    Throwable problem = null;
    try {
        chain.doFilter(request, response);
    } catch (Throwable t) {
        // If an exception is thrown somewhere down the filter chain,
        // we still want to execute our after processing, and then
        // rethrow the problem after that.
        problem = t;
        t.printStackTrace();
    }
}

}

我正在使用urlPattern / web / *,以便web目录中的每个页面都将通过此过滤器。过滤器现在只是打印用于调试的东西。但每当我访问web目录或任何其他页面内的页面时,它都不会通过过滤器。我也尝试使用/ faces / web / *作为urlPattern,但这也没有用。但是当我把/ *作为urlPattern时,每个被访问的页面都会通过过滤器。 我正在访问页面作为
    http://localhost:8080/CodesignWebApp/faces/web/sign/SelectServer.xhtml http://localhost:8080/CodesignWebApp/faces/web/sign/FileUpload.xhtml?signmethod=MICROSOFT

我怀疑urlPattern有问题。

1 个答案:

答案 0 :(得分:0)

  

我正在访问页面

     

http://localhost:8080/CodesignWebApp/faces/web/sign/SelectServer.xhtml
  http://localhost:8080/CodesignWebApp/faces/web/sign/FileUpload.xhtml

@WebFilter(和@WebServlet)的网址格式必须与您在浏览器地址栏中看到的网址完全匹配(因此不是磁盘文件您在服务器端实际拥有的系统路径;它实际上也称为" URL模式",而不是"文件模式"或其他)。

所以,总而言之,如果/CodesignWebApp是webapp的上下文根,那就应该这样做:

@WebFilter("/faces/web/*")
public class AuthenticationFilter implements Filter {
    // ...
}

(过滤器名称不相关,您指定的请求调度程序方法已经是默认值)

另一种选择是完全摆脱古老的JSF 1.0样式/faces/*映射,并用JSF 2.0样式*.xhtml映射替换它。您不希望最终用户在从网址中删除/faces部分时看到原始JSF源代码,对吗?

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

这样您就可以按如下方式访问页面:

  

http://localhost:8080/CodesignWebApp/web/sign/SelectServer.xhtml
  http://localhost:8080/CodesignWebApp/web/sign/FileUpload.xhtml

按如下方式映射过滤器:

@WebFilter("/web/*")
public class AuthenticationFilter implements Filter {
    // ...
}

另见: