Действие 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.