我对Spring MVC / Rest有疑问。
假设我有一项服务,您可以通过输入以下网址http://localhost:8080/project/api/get/user/1
来检索用户的用户详细信息(JSON)。
我的前端应用程序在http://localhost:9000/
上运行,我可以从API获取数据。但是,我可以在任何域上执行此操作。我的目标是只提供单个(或列表)域/ ips。
所以我在我的API中添加了以下过滤器,以便它只接受来自localhost:9000
的调用@Component
public class CORSFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain)
throws ServletException, IOException {
res.addHeader("Access-Control-Allow-Origin","http://localhost:9000");
/* other code*/
现在它确实阻止来自其他域的调用。但是,如果我使用像Postman这样的工具,我仍然可以获取数据!我错过了什么吗?我在这里做的是一种安全和正确的方式吗?如果我使用Postman,为什么我仍然能够获取甚至发布数据?
答案 0 :(得分:1)
CORS仅使用AJAX影响两个不同域之间的请求
如果您只想影响某些控制器,可以像
那样对它们进行声明@PreAuthorize("hasIpAddress('192.168.1.0/24')")
@Controller
public class Controller {
...
}
否则,如果您想限制所有请求,您可以自定义过滤器
@Component
public class ValidDomainFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain)
throws ServletException, IOException {
String ipAddress = req.getRemoteAddr();
int port = req.getRemotePort();
if(isValidDomain(ipAddress,port)){
filterChain.doFilter(req, res);
} else {
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(req,res);
/* redirect or do whatever you need*/
}
}
private boolean isValidDomain(String ipAddress, int port){
/* do validation */
}
}