2015-11-05 2 views
1

У меня есть вопрос относительно Spring MVC/Rest.Spring MVC/REST получение данных только из определенного домена

Скажите, что у меня есть служба, в которой вы можете получить информацию о пользователе (JSON) пользователя, указав следующий URL-адрес http://localhost:8080/project/api/get/user/1.

Мое внешнее приложение работает: http://localhost:9000/, и я могу получить данные из API. Однако я могу сделать это в любом домене. И моя цель - обслуживать только один (или список) доменов/ips.

Поэтому я добавил следующий фильтр к моему API для того, чтобы только принимать звонки с локального хоста: 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?

ответ

1

CORS затрагивает только запросы между двумя различными доменами с использованием AJAX

Если вы хотите, влияют только на некоторые из ваших контроллеров вы можете annote их как

@PreAuthorize("hasIpAddress('192.168.1.0/24')") 
@Controller 
public class Controller { 

... 

} 

Else, если вы хотите, чтобы ограничить все запросы, которые можно настроить ваш фильтр

@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 */ 
    } 

} 
Смежные вопросы