从另一个POST

时间:2018-04-13 06:34:11

标签: java spring spring-mvc

开发包含购买屏幕的网站。我将使用类似于 PAYPAL 的服务。我只需要将POST数据发送到此服务,服务就会照顾它。

问题是,我想隐藏一些字段。因此输入类型隐藏不是一个选项。所以我添加了一个只包含一个数据的简单表单 productId ,然后使用添加的数据重定向POST。

现在问题是,数据是作为URL参数发送的(我可以在浏览器的URL中看到这些值)。我希望这些值(在示例中,userId和reference)作为POST数据。我怎么能做到这一点?

代码:

@RequestMapping(value = "/doPurchase", method = RequestMethod.POST)
public ModelAndView doPurchase(Principal principal, HttpServletRequest request,
        @RequestParam(value = "productId", required = true) String productId, RedirectAttributes attributes) {
    //
    Product product = productRepository.findByProductCode(productId);
    //
    // DO STUFF...
    //
    ModelAndView modelAndView = new ModelAndView("redirect:PAYMENT_SERVICE_URL");

    attributes.addAttribute("UserId", "USER_ID");
    attributes.addAttribute("Reference", "REF_ID");
    //
    // ETC ETC

    //
    request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);
    return modelAndView;
}

1 个答案:

答案 0 :(得分:2)

301 / 302无法重定向执行POST请求。 307可以重复POST请求,但您无法对其进行修改。

参考:

一些绕道方法:

  1. PAYMENT_SERVICE_URL接受GET和POST请求。

  2. 创建一个中间页面接受重定向的GET请求,并生成一个HTML POST表单到PAYMENT_SERVICE_URL,然后通过JavaScript自动提交表单。

  3. 如果您使用的是SpringFramework,请考虑使用Flash Attributeshttps://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-flash-attributes

  4. 如果您确实想要以一般方式隐藏某些参数,可以将值存储在数据库表中,并通过GET请求将行的id传递到重定向页面,然后加载id的数据库表中的参数。或者,您可以加密/解密参数。