为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在控制器级别添加请求参数并将其转发到另一个网站吗?

我可以在控制器级别添加请求参数并将其转发到另一个网站吗?

慕桂英546537 2022-07-27 11:29:31
这个想法是,我收到了包含一些参数的 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 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

不那么脏(据我所知)的方法是扩展请求:


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);


查看完整回答
反对 回复 2022-07-27
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

Spring MVC 提供了一组强大的功能来自动为您解析和映射 HTTP 请求和响应,因此您不必手动执行,可以专注于业务逻辑。在这种情况下,Spring 可以为您提供所有请求参数的映射,如下所示:

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

(或者,如果您需要多值参数,您可以使用MultiValueMap,它更符合标准,但使用起来更复杂)。你会得到一份地图的私人副本,实际上它是一个可变的LinkedHashMap,但如果你不确定你总是可以直接说new HashMap<>(params).

一旦你有了这个params地图,你可以添加任何你想要的附加值,但除非你可以在你自己的应用程序中将某人发送到另一个控制器,否则你需要生成一个redirect:响应(在这种情况下,VIN 将在URL)或自己向其他服务发出 REST 请求,然后将信息转发回用户。


查看完整回答
反对 回复 2022-07-27
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

您可以将重定向发送到另一个网站,但不能将其转发到另一个网站。使用 resp.sendRedirect(url);



查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信