【发布时间】:2019-12-12 09:50:42
【问题描述】:
我在前端使用 Angular 并在后端使用 Spring 构建了一个单页 Web 应用程序。它是一个社区网站,我希望能够以春天的方式禁止行为不端的用户。我已经搜索了 stackoverflow 以查看是否有关于此的线程,但我找不到。
我尝试构建这个功能是通过创建一个自定义的网络过滤器来过滤所有传入的请求并检查请求者的 ip 地址是否在被阻止的 ip 列表中。如果不是,则转发请求,但如果它在列表中,则返回错误响应。
这里是过滤器的代码和一个实现接口:
package RequestPreprocessors;
import DAOs.BanDao;
import Interfaces.IpAddressExtractor;
import Services.ModeratorService;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;
import java.util.logging.Logger;
@WebFilter("/*")
public class IpAddressFilter implements Filter, IpAddressExtractor {
private static final Logger log = Logger.getLogger("IpAddressFilter.class");
private Set<String> blockedIpAddresses;
@Autowired
private ModeratorService moderatorService;
@PostConstruct
private void loadBlockedIpAddresses(){
blockedIpAddresses = moderatorService.getBlockedIpAddresses();
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String clientIpAddress = getClientIP((HttpServletRequest) servletRequest);
log.info("ip " + clientIpAddress + " is requesting " + httpServletRequest.getRequestURI());
if(blockedIpAddresses.contains(clientIpAddress)) {
log.info(clientIpAddress + " is currently on the banlist, aborting request...");
httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
这是实现接口的代码
public interface IpAddressExtractor {
public default String getClientIP(HttpServletRequest request) {
String xfHeader = request.getHeader("X-Forwarded-For");
if (xfHeader == null){
return request.getRemoteAddr();
}
return xfHeader.split(",")[0]; // voor als ie achter een proxy zit
}
}
这应该可行,但我不认为发送简单的 http 状态代码非常优雅,我希望能够向用户发送回一条消息,说明他/她实际上已被禁止。
所以我的问题是;我如何有效地禁止用户使用 Spring Web 应用程序。实际上,我的意思是能够将错误消息发送回单页应用程序,然后可以显示给用户。我还想知道这是否是拒绝被禁止用户从 REST api 访问的最佳方法。我想知道是否有其他更有效的方法来实现这一点。
谢谢
编辑:这是我用来创建大部分代码https://www.baeldung.com/java-web-app-without-web-xml的教程
【问题讨论】:
-
关心解释为什么这个线程应该关闭?我认为这是一个有效的问题,并且对于希望能够在春季禁止/阻止 IP 地址的任何其他人来说也非常有用,因为在 SO 上没有关于此主题的其他问题。
-
你试过用这个 (docs.oracle.com/javaee/7/api/javax/servlet/http/…) 代替吗?
-
@second 是的,与此同时,我发现了这个方法重载并已经实现了它:) 但无论如何感谢您的建议。
-
有很多方法可以实现访问限制。您有多个问题,您想知道意见和替代方案,但 stackoverflow 问题格式适用于具有特定答案的问题,而不是讨论。
-
考虑链接到您找到的相关问题,例如stackoverflow.com/questions/12786123/…
标签: java spring servlet-filters servlet-3.0