Действие Struts не отображает правильный путь после изменения в контроллере

Я работаю над очень старым сайтом J2EE/ Struts и из-за недавнего прекращения поддержки протокола SSL 3 PayPal, я пытаюсь внедрить новый процесс размещения платежей, при котором платежный шлюз принимает POST с деталями заказа, обрабатывает кредитную карту проверки и возвращает код ответа (и миллион других значений) через другой POST.

Я пытаюсь использовать существующие действия в Struts, но зависаю, потому что путь, указанный в struts -config.xml (/store/order/confirmation.do), не отображается; вместо этого после обработки запроса POST от удаленного сервера и вызова ActionMapping.findForward() приложение просто отображает тот же путь, который был запрошен в POST, с удаленного сервера (/store/checkout/submitOrder.do),

Если я пытаюсь добавить redirect="true" к форварду в struts-config.xml, меня перенаправляют на правильный путь, но с исключением pagecontext, которое я не могу отладить, потому что он не зарегистрирован.

Раньше это работало так, что форма submitOrder была пустой - просто вход для отправки. Затем детали извлечения из корзины покупок на основе сеанса и связанных с ними форм выставления счетов покупателям будут переданы в специальную библиотеку verisign для генерации ответа. Теперь я хочу использовать форму POST от нового провайдера, но я застрял на этом фиаско перенаправления.

Строка в struts-config.xml выглядит следующим образом:

<action path="/store/checkout/submitOrder" type="com.company.action.CheckoutAction" parameter="submitOrder" scope="request">
  <set-property property="secure" value="true"/>
  <forward name="success" path="/store/order/confirmation.do"/>
</action>

И действие идет так:

public ActionForward submitOrder(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  String method = request.getMethod();
  if (method != null && method.equals("POST")) {
    ShoppingCart sc = (ShoppingCart) request.getSession(false).getAttribute("shoppingCart");
    if (sc == null) { throw new SessionExpiredException("Submit Order - Shopping Cart is not in session"); }
    ResourceBundle appConfig = ResourceBundle.getBundle("resources.application");

    PFProClient client = new PFProClient();

    /* THIS saveOrder() METHOD WAS RE-WRITTEN TO TAKE the httpservletrequest (form POST) instead of an instance of VerisignResponse, defined in another library. */

    client.saveOrder(sc, request);
    User user = (User)request.getSession(false).getAttribute(Globals.USER);
    if (user != null) { UserModel.saveUser(user, sc.getCustomer(), sc.getOrder()); }
    //Remove items from session
    request.getSession().setAttribute("customerBillingForm", null);
    request.getSession().setAttribute("customerShippingForm", null);
    request.getSession().setAttribute("customerCreditForm", null);
    request.getSession().setAttribute("cartForm", null);
    request.getSession().setAttribute("shoppingCart", null);
    //remove the shopping cart from the cookie & DB
    ShoppingCartUtils.deleteSavedCartFromCookie(response, request);
    //remove the CHECKING_OUT flag
    request.getSession().setAttribute(Globals.CHECKING_OUT, null);
    //remove the PAYING_WITH_PAYPAL flag
    request.getSession().setAttribute(Globals.PAYING_WITH_PAYPAL, null);
    // Set cart in request for order confirmation page
    request.setAttribute("shoppingCart", sc);
    return mapping.findForward("success");
  } else {
    // HTTP method was not POST
  }
  return mapping.findForward("success");
}

РЕДАКТИРОВАТЬ

Я проверил, что действие submitOrder обрабатывается как запрос POST. Мне интересно, если, поскольку предыдущий POST был просто пустой формой, дополнительные параметры POST загрязняют что-то и мешают правильной маршрутизации.

В плитке-defs.xml ресурс для представления подтвержения:

<definition name="confirm.order" path="/templates/layouts/order-confirmation.jsp">
  ...
  <put name="content" value="/store/checkout/confirmOrder.jsp"/>
</definition>

Приложение обслуживает представление verifyOrder.jsp, но не перенаправляет в /store/order/confirmation.do, поэтому любые попытки перезагрузить страницу побуждают пользователя повторно отправить форму, что, очевидно, нежелательно.

Я также удалил ссылку на name="emptyForm" из определения действия submitOrder (поскольку форма POST, полученная с удаленного сервера, не будет иметь атрибута имени emptyForm) в struts-config.xml, которая определяется как:

<form-bean name="emptyForm" type="org.apache.struts.action.DynaActionForm"/>

Я не уверен, какой эффект это будет иметь либо.

1 ответ

Решение

С форвардами клиент всегда будет думать, что он все еще смотрит на запрошенный ресурс (submitOrder.do) потому что у него нет возможности узнать что-либо лучше (то есть был сделан один запрос на ресурс, и ответ был получен). Содержание ответа должно исходить от прямого ресурса (confirmation.do) хоть.

Если содержание ответа не приходит от confirmation.doтогда мы смотрим на другую проблему. В этом случае, скорее всего, обратный вызов PayPal использует метод запроса, отличный от POST, который обойдет большую часть submitOrder() код (// HTTP method was not POST). И действие Struts позади confirmation.doпри отсутствии необходимых атрибутов сеанса или запроса, возможно, отображается страница submitOrder.

Другие вопросы по тегам