URL при работе на локальном сервере(Ajax, Spring)

390
05 июня 2017, 22:44

Есть веб-приложение на Spring MVC, клиентская сторона посылает Ajax запросы на сервер.

Есть класс, замапленный на:

@RequestMapping("/cars")

Маппинг метода, принимающего Ajax запрос:

@RequestMapping(method = RequestMethod.POST) 

Ajax запрос:

 $.ajax({
            type: 'POST',
            url:  '/cars',
            data: msg,
            success: function(receive) {
              alert(receive);
            },
            error: function() {
                alert('Error');
            }
        });

Имя варника: shop

Проблема:

Когда стартую через IDEA localhost:8080/cars запрос обрабатывается, когда через сервер localhost:8080/shop/cars - ошибка 404

Вопрос: По какому адресу Ajax отправляет запросы - дописывает к корневомн url строку из поля url в его описании?

Answer 1

У браузера своё представление о том, какой адрес является базовым. Причём отличное от представления серверной стороны. В Вашем случае это будет localhost:8080 хоть в IDE, хоть в сервере.

В JSP вызов ajax можете написать так:

$.ajax({
    type: 'POST',
    url:  '${pageContext.request.contextPath}/cars',
    data: msg,
    success: function(receive) {
        alert(receive);
    },
    error: function() {
        alert('Error');
    }
});

pageContext.request.contextPath будет пустой в IDE и /shop на сервере.
url соответственно /cars или /shop/cars в зависимости от ситуации.
И таким нехитрым образом будет работать везде. Даже если переименуете своё приложение, то всё равно будет работать.

Можно попробовать установить базовый адрес с помощью элемента <base>.

<base href="${pageContext.request.contextPath}/"/>

И использовать относительные ссылки (без / спереди).

$.ajax({
    type: 'POST',
    url:  'cars',

Точно не знаю, но скорей всего сработает.
<base> заставит браузер (и как следствие ajax?) пересмотреть свою позицию относительно того, какой адрес является базовым для относительных ссылок.
Но и Вам придётся пересмотреть все ссылки на странице и привести их в согласие с <base>.

Можно создать глобальную переменную javascript в первых строках JSP

<script>
    CONTEXTPATH = "${pageContext.request.contextPath}"
</script>

И использовать её в скриптах

$.ajax({
    type: 'POST',
    url:  CONTEXTPATH + '/cars',
READ ALSO
Android - socket.io посыл данных всем клиентам в виде byte[]

Android - socket.io посыл данных всем клиентам в виде byte[]

ЗдравствуйтеМоя проблема в том, что я никак не соображу в чем именно может быть проблема

602
Ускорить процесс парсинга

Ускорить процесс парсинга

Как можно изменить код, чтобы скачивание происходило быстрее?

339