代码之家  ›  专栏  ›  技术社区  ›  Dominik Obermaier

如何使用Seam和JBoss作为阻止IP?

  •  2
  • Dominik Obermaier  · 技术社区  · 14 年前

    出于安全原因,如果用户试图以管理员身份登录并且输入了3次错误的密码,我们希望通过应用程序中的IP地址阻止用户。

    这是很容易得到的IP地址的用户试图登录。我使用以下代码片段获取IP:

    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletRequest request = (HttpServletRequest)context.getRequest();
    String ip = request.getRemoteAddr();
    

    我们使用的是JBoss 5.1.0 GA和Seam 2.2.1.CR2。据我所知,没有办法阻止Seam中的IP地址。但是有没有可能调用JBoss函数来阻止特定的IP呢?

    如果Seam对此有支持,请告诉我:)

    3 回复  |  直到 14 年前
        1
  •  3
  •   Shervin Asgari    14 年前

    这应该很容易做到。

    假设您有一个应用程序范围集,其中包含要阻止的所有ip,则可以使用此筛选器:

    @Startup
    @Scope(ScopeType.APPLICATION)
    @Name("ipFilter")
    @BypassInterceptors
    @Filter(around ="org.jboss.seam.web.ajax4jsfFilter")
    public class IpFilter extends AbstractFilter {
    
      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
              throws IOException, ServletException {
    
          if (!(req instanceof HttpServletRequest)) {
              chain.doFilter(req, res);
              return;
          }
    
          HttpServletRequest request = (HttpServletRequest) req;
    
          Set<String> ips = (Set<String>)Component.getInstance("blockedIps");
          if(ips.contains(request.getRemoteAddr())) {
            throw new ServletException("Permission denied");
          }
    
          chain.doFilter(req, res);
    
        }
    }
    
        2
  •  2
  •   Community datashaman    7 年前

    如果在Jboss服务器前面有一个Apache服务器,那么调用 request.getRemoteAddr();

    而是使用 X-Forwarded-For header

    正如普里尼奥所说,你可以使用过滤器。如果你不想这样做,那么你也可以使用 page action .

        3
  •  1
  •   Plínio Pantaleão    14 年前

    我对此一无所知。但是你可以创建一个简单的过滤器(javax.servlet.Filter文件)阻止来自一组IP的请求。其实很简单。