Могу ли я добавить параметр запроса на уровне контроллера и переслать его на другой сайт? - PullRequest
0 голосов
/ 08 марта 2019

Идея в том, что я получаю POST-запрос с некоторыми уже включенными параметрами. например, название автомобиля и цена

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

Затем, с добавленным параметром, я хочу переслать этот запрос на другой сайт, который передал все данные, которые я передал (название машины, цена, vin)

Есть ли способ реализовать на уровне контроллера, а не фильтры?

@RequestMapping(value = "/abc")
public void ABC(final HttpServletRequest request) {
     request.getParameterMap().put("vin", VIN_CODE); // cannot do that because it is read-only
     return "forward:https://completelyanothersite.com";
}

РЕДАКТИРОВАТЬ: на основе комментариев, переадресация не является решением, вместо перенаправления является

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Немного менее грязный (насколько мне известно) способ сделать это - расширить запрос:

public class WrappedHttpServletRequestWrapper extends HttpServletRequestWrapper
{
    private final Map<String, String[]> modifiableParameters;
    private Map<String, String[]> allParameters = null;


    public WrappedHttpServletRequestWrapper (final HttpServletRequest request, 
                                                    final Map<String, String[]> additionalParams)
    {
        super(request);
        modifiableParameters = new TreeMap<String, String[]>();
        modifiableParameters.putAll(additionalParams);
    }

    @Override
    public Map<String, String[]> getParameterMap()
    {
        // allParameters contains old parameters + the ones you added 
        return Collections.unmodifiableMap(allParameters);
    }
    //... other overriden methods
}

И используйте это, чтобы добавить свои параметры. Вот ссылка .

А вот как вы будете его использовать:

Map<String, String[]> extraParams = new TreeMap<String, String[]>()
HttpServletRequest wrappedRequest = new WrappedHttpServletRequestWrapper(request, extraParams);
request.getRequestDispatcher("url").forward(wrappedRequest, response);
0 голосов
/ 08 марта 2019

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

@PostMapping("/abc")
public void abc(@RequestParam Map<String, String> params) { ... }

(или, если вам нужны многозначные параметры, вы можете использовать MultiValueMap, что немного более корректно по стандартам, но немного сложнее в работе). Вы получаете личную копию карты, которая на практике является изменяемой LinkedHashMap, но если вы не уверены, вы всегда можете просто сказать new HashMap<>(params).

Получив эту карту params, вы можете добавить к ней любые дополнительные значения, которые хотите, но если вы не можете отправить кого-то на другой контроллер внутри своего собственного приложения, вам потребуется либо сгенерировать ответ redirect: (в в этом случае VIN будет виден в URL) или сделайте запрос REST самостоятельно для другой службы, а затем передайте информацию обратно пользователю.

0 голосов
/ 08 марта 2019

Вы можете отправить перенаправление на другой сайт, но не можете переслать его на другой сайт.Используйте resp.sendRedirect (url);

См. Эту тему Разница между JSP forward и redirect

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...