如何为基于IceFaces的Web应用程序创建过滤器?

时间:2011-11-28 02:55:22

标签: java icefaces servlet-filters icefaces-1.8

我使用的是IceFaces 1.8.2。我想创建一个Filter,以便人们无法访问我的应用程序的未经授权的URL。

我试图像这样创建一个Filter

public class AuthenticationFilter implements Filter {

    private FilterConfig config;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.config=filterConfig;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse resp=(HttpServletResponse)response;
        //HttpSession session=req.getSession(true);
        String pageRequested=req.getRequestURL().toString();
        System.out.println("Page Requested="+pageRequested);

        HttpSession session = req.getSession(false);
        if (!session.isNew()) {
          if(ManageCustomerMbeans.AUTH_KEY!=null){
            System.out.println(":::::::::::::::::::::::::Login Authenticate");
            chain.doFilter(req, resp);
          }
        }
        else {
            System.out.println("::::::::::::::::::::::::::Not Authenticate");
          //Session has expired - redirect to login.jsp
        }
    }

    public void destroy() {

    }

}

但结果是,如果我输入其URL,受限制的页面仍会显示。如果我像这样阻止其他页面:

if (!(pageRequested.contains("Login.jsp")&&session.getAttribute(ManageCustomerMbeans.AUTH_KEY)==null)) {
    System.out.println("Filter Error!!!");
    resp.sendRedirect("./error");
} else {
    chain.doFilter(request, response);
}

也没有发生任何事情。

如何为基于IceFaces的Web应用程序正确创建Filter

** * ** * ** * 的*** 更新 * ** * ** * ** * ****

经过BalusC先生的修正后,我在我的Filter课程中做了很多修正,加上一点调整,因为我使用了icefaces 1.8.2 ..这是我的修正,它有效:

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

        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse resp=(HttpServletResponse)response;
        HttpSession session = req.getSession(false);
        String pageRequested=req.getRequestURL().toString();

        String resources="resources/";
        String xmlhttp="xmlhttp/";
        String kaptcha="kaptcha.jpg";
        String block="block/";
        if(pageRequested.contains("login")||pageRequested.contains(resources)
                ||pageRequested.contains(block)||pageRequested.contains(xmlhttp)
                ||pageRequested.contains(kaptcha)||pageRequested.contains("error")
                ||pageRequested.contains("logout")||pageRequested.contains("lsuccess")){

            chain.doFilter(req, resp);
        }else{

            if (session != null && session.getAttribute(ManageUsersMBeans.AUTH_KEY) != null) {

            chain.doFilter(req, resp);
            } else {

                resp.sendRedirect(req.getContextPath() + "/error");
            }
        }



    }

并在web.xml中:

    <filter>
        <filter-name>AuthenticationFilter</filter-name>
        <filter-class>com.do.tools.util.AuthenticationFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>AuthenticationFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

由于

2 个答案:

答案 0 :(得分:3)

如果根本没有调用过滤器,即永远不会执行doFilter()方法,那么过滤器映射是完全错误的。您需要验证<filter-mapping>中的web.xml。它必须映射到<servlet-name>的{​​{1}}或覆盖受限页面的FacesServlet,例如<url-pattern>/app/*等,具体取决于在您的文件夹结构。

如果确实调用了过滤器,那么您的代码逻辑流是完全错误的。让我们看看你的第一次尝试:

/secured/*

这个流程显然是错误的。首先,您正在使用HttpSession session = req.getSession(false); if (!session.isNew()) { if(ManageCustomerMbeans.AUTH_KEY!=null){ chain.doFilter(req, resp); } } else { //Session has expired - redirect to login.jsp } 进行会话,这意味着它可能会返回false,但您永远不会检查它。然后,您正在检查最近是否已创建会话,如果null返回非空会话,则永远不会true。因此,始终输入第一个getSession(false)块。然后你要检查一个常量值是否为空,但是这可以从不if,因为它显然是一个常数。因此,您的false 总是被调用。假设常量表示属性键,则需要按如下方式重写:

chain.doFilter()

这将检查会话是否为空且包含已登录的用户。如果为true,则继续请求,否则重定向到登录页面。您只需要确保登录页面与过滤器的映射不匹配,否则您需要在请求URI的HttpSession session = req.getSession(false); if (session != null && session.getAttribute(ManageCustomerMbeans.AUTH_KEY) != null) { chain.doFilter(req, resp); } else { resp.sendRedirect(req.getContextPath() + "/login.jsp"); } 块中添加额外的检查。

你的第二次尝试也是错误的:

if

如果用户没有进入登录页面,这将始终重定向到错误页面。如果用户在未登录的情况下进入登录页面,这将仅继续请求。这种逻辑毫无意义。但如果你说“它不起作用”,那么它只能意味着过滤器映射是错误的。

答案 1 :(得分:0)

如果您想限制对网址的未经授权的访问,最好的方法是使用Servlets Security

一些链接:

Securing Containers

下面是一个示例,它允许只有经理才能访问安全页面。

<security-constraint>

      <web-resource-collection>

          <web-resource-name>secured</web-resource-name>

          <url-pattern>/secured/*</url-pattern>

          <http-method>GET</http-method>

          <http-method>POST</http-method>

     </web-resource-collection>

     <auth-constraint>

          <role-name>Manager</role-name>

     </auth-constraint>

    <user-data-constraint>

         <transport-guarantee>CONFIDENTIAL</transport-guarantee>

    </user-data-constraint>

</security-constraint>

<security-constraint>

    <web-resource-collection>

         <web-resource-name>unsecured</web-resource-name>

               <url-pattern>/unsecured/*</url-pattern>

               <http-method>GET</http-method>

               <http-method>POST</http-method>

        </web-resource-collection>

        <auth-constraint>

               <role-name>*</role-name>

         </auth-constraint>

</security-constraint>