出于安全原因,我们希望在我们的应用程序中通过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对此有所支持,请告诉我。)
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
如果你的Jboss服务器前面有一个Apache服务器,那么调用request.getRemoteAddr();
只会给你Apache服务器的IP。
正如Plinio所说,你可以使用过滤器。如果您不想这样做,那么您也可以使用page action。
答案 2 :(得分:1)
我对此一无所知。但是您可以创建一个简单的Filter(javax.servlet.Filter)并阻止来自一组IP的请求。这很简单。