В чем разница между передачей сообщений и вызовом метода?

У меня есть рабочий solulion, используя ответы от @John и @Arpad link и @RobWinch link

Я использую Spring Security 3.2.9 и jQuery 1.10.2.

Расширить класс Spring, чтобы вызвать ответ 4XX только из запросов AJAX:

public class CustomLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {

    public CustomLoginUrlAuthenticationEntryPoint(final String loginFormUrl) {
        super(loginFormUrl);
    }

    // For AJAX requests for user that isn't logged in, need to return 403 status.
    // For normal requests, Spring does a (302) redirect to login.jsp which the browser handles normally.
    @Override
    public void commence(final HttpServletRequest request,
                         final HttpServletResponse response,
                         final AuthenticationException authException)
            throws IOException, ServletException {
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        } else {
            super.commence(request, response, authException);
        }
    }
}

applicationContext-security.xml

  
        
     
    
...
    
        
    
...

    
      
        
          
            
              
            
            
            
          
        
      
    

В моих JSP добавьте глобальный обработчик ошибок AJAX, как показано здесь здесь

  $( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
      if ( jqxhr.status === 403 ) {
          window.location = "login.jsp";
      } else {
          if(thrownError != null) {
              alert(thrownError);
          } else {
              alert("error");
          }
      }
  });

. Также удалите существующие обработчики ошибок из вызовов AJAX в JSP-страницах:

        var str = $("#viewForm").serialize();
        $.ajax({
            url: "get_mongoDB_doc_versions.do",
            type: "post",
            data: str,
            cache: false,
            async: false,
            dataType: "json",
            success: function(data) { ... },
//            error: function (jqXHR, textStatus, errorStr) {
//                 if(textStatus != null)
//                     alert(textStatus);
//                 else if(errorStr != null)
//                     alert(errorStr);
//                 else
//                     alert("error");
//            }
        });

Надеюсь, что это поможет другим.

Update1 Я обнаружил, что мне нужно добавить параметр (always-use-default-target = "true") в конфигурацию формы входа. Это было необходимо, так как после запроса AJAX перенаправляется на страницу входа (из-за истекшего сеанса), Spring запоминает предыдущий запрос AJAX и автоматически перенаправляет его после входа в систему. Это приведет к отображению возвращаемого JSON на странице браузера. Конечно, не то, что я хочу.

Update2 Вместо использования always-use-default-target="true" используйте пример @RobWinch блокировки запросов AJAX из requstCache. Это позволяет нормальным ссылкам перенаправляться на исходную цель после входа в систему, но AJAX переходит на домашнюю страницу после входа в систему.

30
задан Scrollbar 25 August 2010 в 01:40
поделиться

4 ответа

Есть ли разница между передачей сообщений и вызовом метода, или их можно считать эквивалентными?

Они похожи. Некоторые отличия:

Сообщения могут передаваться синхронно или асинхронно (например, разница между SendMessage и PostMessage в Windows)

Вы можете отправить сообщение, не зная точно, на какой удаленный объект вы его отправляете

Целевой объект может быть на удаленной машине или в O / S.

3
ответ дан 27 November 2019 в 22:44
поделиться

в первом приближении ответ: нет, пока вы "ведете себя нормально"

Хоть многие и думают, что есть - технически это обычно одно и то же: кэшированный поиск фрагмента кода, который должен быть выполнен для конкретной именованной операции (по крайней мере, в обычном случае). Называть имя операции «сообщением» или «виртуальным методом» не имеет значения.

НО: язык Актера действительно отличается: наличие активных объектов (каждый объект имеет неявную очередь сообщений и рабочий поток — по крайней мере, концептуально) упрощает обработку параллельной обработки (Google также «обмен последовательными процессами» для более).

НО: в Smalltalk можно оборачивать объекты, чтобы сделать их похожими на актеров, без фактического изменения компилятора, синтаксиса или даже перекомпиляции.

НО: в Smalltalk, когда вы пытаетесь отправить сообщение, которое не понимает получатель (т.е. "someObject foo:arg"), создается объект-сообщение, содержащий имя и аргументы, и это сообщение- объект передается в качестве аргумента в сообщение «doesNotUnderstand». Таким образом, объект может сам решать, как поступать с нереализованными сообщениями-отправками (также известными как вызовы нереализованного метода). Конечно, он может поместить их в очередь, чтобы рабочий процесс упорядочил их по порядку...

Конечно, это невозможно со статически типизированными языками (если только вы не слишком активно используете рефлексию), но на самом деле это ОЧЕНЬ сложно. полезная функция. На этой схеме построены прокси-объекты, загрузка кода по запросу, удаленные вызовы процедур, обучающийся и самомодифицирующийся код, адаптирующиеся и самооптимизирующиеся программы, оболочки corba и dcom, рабочие очереди. Конечно, им можно злоупотреблять и приводить к ошибкам во время выполнения. Так что это двусторонний меч. Острый и мощный, но опасный в руках новичков...

РЕДАКТИРОВАТЬ: Я пишу здесь о языковых реализациях (как в Java против Smalltalk, а не о межпроцессных механизмах.

9
ответ дан 27 November 2019 в 22:44
поделиться

IIRC, официально доказано, что они эквивалентны. Не нужно много думать, чтобы хотя бы указать, что они должны быть. Все, что для этого требуется, — это на мгновение игнорировать прямую эквивалентность вызываемого адреса фактическому месту в памяти и рассматривать его просто как число.С этой точки зрения число — это просто абстрактный идентификатор, однозначно идентифицирующий конкретный тип функциональности, которую вы хотите вызвать.

Даже когда вы вызываете функции на одной и той же машине, нет реального требования, чтобы вызываемый адрес прямо указывал физический (или даже виртуальный) адрес вызываемой функции. Например, хотя почти никто никогда их не использует, шлюзы задач защищенного режима Intel позволяют сделать вызов непосредственно к самому шлюзу задач. В этом случае только сегментная часть адреса рассматривается как фактический адрес, т. е. любой вызов сегмента шлюза задач приводит к вызову одного и того же адреса, независимо от указанного смещения. При желании код обработки может проверить указанное смещение и использовать его для принятия решения о вызове отдельного метода, но отношение между указанным смещением и адресом вызываемой функции может быть совершенно произвольным.

Вызов функции-члена — это просто тип передачи сообщений, который обеспечивает (или, по крайней мере, облегчает) оптимизацию при обычных обстоятельствах, когда клиент и сервер рассматриваемой службы совместно используют общее адресное пространство. Соответствие 1:1 между абстрактным идентификатором службы и адресом, по которому находится поставщик этой службы, позволяет тривиально и исключительно быстро отображать одно на другое.

В то же время не заблуждайтесь: тот факт, что что-то выглядит как вызов функции-члена, не препятствует его фактическому выполнению на другой машине или асинхронно, или (часто) и тому, и другому.Типичным механизмом для достижения этого является прокси-функция, которая переводит «виртуальное сообщение» вызова функции-члена в «реальное сообщение», которое может (например) передаваться по сети по мере необходимости (например, DCOM и CORBA от Microsoft делают это). это довольно привычно).

7
ответ дан 27 November 2019 в 22:44
поделиться

На самом деле это не одно и то же. Передача сообщений — это способ передачи данных и инструкций между двумя или более параллельными процессами. Вызов метода — это способ вызова подпрограммы. Параллелизм Erlang построен на прежней концепции с его параллельным ориентированным программированием.

Передача сообщений, скорее всего, включает в себя форму вызова метода, но вызов метода не обязательно включает передачу сообщения. Если бы это было так, это была бы передача сообщений. Передача сообщений — это одна из форм выполнения синхронизации между параллельными процессами. Вызов метода обычно означает синхронные действия. Вызывающий объект ожидает завершения метода, прежде чем он сможет продолжить работу. Передача сообщений — это форма сопрограммы. Вызов метода — это форма подпрограммы.

Все подпрограммы являются сопрограммами, но не все сопрограммы являются подпрограммами.

5
ответ дан 27 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: