2

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

获取尝试登录的用户的 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对此有一些支持,请告诉我:)

4

3 回答 3

3

这应该很容易做到。

假设您有一个应用程序范围的 Set,其中包含要阻止的所有 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);

    }
}
于 2010-09-21T09:14:02.087 回答
2

如果你的 Jboss 服务器前面有一个 Apache 服务器,那么调用request.getRemoteAddr();只会给你 Apache 服务器的 IP。

而是使用X-Forwarded-For 标头

正如 Plinio 所说,您可以使用过滤器。如果您不想这样做,那么您也可以使用页面操作

于 2010-09-20T04:42:21.113 回答
1

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

于 2010-09-16T17:53:16.497 回答