代码之家  ›  专栏  ›  技术社区  ›  Bevor

动态替换路径参数

  •  0
  • Bevor  · 技术社区  · 7 年前

    @Provider
    @Priority(value = 1)
    public class SecurityCheckRequestFilter implements ContainerRequestFilter
    {
        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException
        {
            //CODE
    
            requestContext.getUriInfo().getPathParameters().putSingle("userId", someNewUserId);
        }
    }
    

    当我调试它时,路径变量“userId”似乎被替换,但在工作流中稍后的端点处(例如 /user/{userId} ),旧值再次出现。没有替换任何内容。在最新的RestEasy文档中没有关于这种行为的信息,但在 very old Resteasy doc ,有一个信息 getPathParameters() 然而,该值不会被替换。如何用新值覆盖现有路径参数?

    (当然,我可以添加新的userId作为一些头参数,然后在端点中获取信息,但这不是一个好的解决方案)

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bevor    7 年前

    我现在有了一个解决方案。 @PreMatching . 这会导致在请求中更早地执行提供程序,因此您可以在处理路径之前对其进行操作。缺点是我无法使用 PathParameters 因为占位符 {userId} 此时未设置。相反,我必须以某种方式从路径中逐段提取信息:

    List<PathSegment> pathSegments = requestContext.getUriInfo().getPathSegments();

    不幸的是,我从新路径重建了整个路径(包括查询参数!)更改用户ID。

    String fullPath = requestContext.getUriInfo().getPath();
    MultivaluedMap<String, String> queryParameters = requestContext.getUriInfo().getQueryParameters(true);
    
    String modifiedPath = fullPath.replaceFirst(obfuscationId, userId); 
    
    UriBuilder uriBuilder = UriBuilder.fromPath(modifiedPath);
    queryParameters.forEach((k,v) -> { uriBuilder.queryParam(k, v.get(0)); } );
    requestContext.setRequestUri(uriBuilder.build());