【问题标题】:How can I modify request in spring mvc filter or interceptor如何在spring mvc过滤器或拦截器中修改请求
【发布时间】:2019-08-17 07:49:59
【问题描述】:

我的请求中有两个常用参数data1和data2,我需要将它们解密为10个参数,并在我的控制器中使用它们。

我尝试将 HttpServletRequest 参数替换为过滤器中的 My Custom HttpServletRequestWrapper 实例。但是我得到了一个 DefaultMultipartHttpServletRequest 实例而不是我的 HttpServletRequestWrapper 实例。所以我无法在我的控制器中获取解密的参数。 我还发现 HandlerInterceptorAdapter 中不能更改请求参数。

public class SecurityFilter extends OncePerRequestFilter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        //todo: convert data1,data2 to param1, ... param10
        logger.info("doFilterInternal 1 " + httpServletRequest);
        filterChain.doFilter(new CultureRequestWrapper(httpServletRequest), httpServletResponse);
        logger.info("doFilterInternal 2 "  + httpServletRequest);
    }
}

public class CultureRequestWrapper extends HttpServletRequestWrapper {

    public CultureRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String[] getParameterValues(String name) {
        //todo:convert
        return super.getParameterValues(name);
    }

}

@RequestMapping(value = {"/req1"})
@ResponseBody
public JsonResult testreq(HttpServletRequest request) {
    logger.info("request:" + request);//get DefaultMultipartHttpServletRequest
    logger.info("request param size:" + request.getParameterMap().size());//get 2 (data1,data2)
    String param1 = request.getParameter("param1");
    ...
    String param10 = request.getParameter("param10");
}

【问题讨论】:

  • 你的控制器方法的签名现在怎么样了?
  • @MaciejKowalski @RequestMapping(value = {"/req1"})@ResponseBody public JsonResult testreq(HttpServletRequest request) { String param1 = request.getParameter("param1"); ... String param10 = request.getParameter("param10"); }

标签: java spring spring-mvc


【解决方案1】:

我建议如下:

1) 创建一个 POJO,它会反映您的 10 个解码值。

2) 解码过滤器/拦截器中的参数并用它们填充 POJO。

3)将POJO设置为请求的属性:

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest,
         HttpServletResponse httpServletResponse, FilterChain filterChain){
        //convert data1,data2 to param1, ... param10 into a POJO

        httpServletRequest.setAttribute("decodedData", pojo);

        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }

4) 在控制器方法上使用@RequestAttribute 注解,以便在您需要的任何地方检索 POJO:

@RequestMapping(value = {"/req1"})
@ResponseBody
public JsonResult testreq(@RequestAttribute("decodedData") PojoWith10Values pojo) {

【讨论】:

  • 控制器方法这么多,请求对象被传递给服务,所以可能需要大量的工作来添加一个RequestAttribute参数。有什么简单的方案吗?
  • 如果你想让你的服务保持无状态,你必须传递这些数据
  • @fm927 你找到解决方案了吗?我正在寻找类似的东西..
猜你喜欢
  • 2021-07-17
  • 2014-06-16
  • 1970-01-01
  • 2016-04-19
  • 2015-01-10
  • 2020-05-21
  • 2012-02-15
  • 2012-02-29
相关资源
最近更新 更多