繁体   English   中英

Spring wevmvc应用中URI匹配

[英]URI matching in Spring wevmvc application

我有一个非常基本的 web mvc 程序。 我目前扫描所有带有 Controller 注释的类,并扫描所有声明的方法以查看它们是否具有自定义注释。 我收集了所有具有自定义注释的路径,以便我可以在过滤器中执行自定义魔术。 到目前为止一切都很好,但是我必须匹配过滤器中的路径,这就是我的问题所在。我还没有找到一个库/util/工具可以做到这一点。 我想要实现的是一种非侵入式的方式来自定义注释请求映射,这样我就可以做一些过滤魔术。 过滤器所做的不是此时的问题,而是将传入的请求 URI 与注释定义的 URI 进行匹配。 这里的问题是定义的路径有参数的占位符,但传入的请求已经填充了它们。 这意味着定义的路径可以是 /mypath/{param1} 而传入的 URI 是 /mypath/somevariable 所以我不能使用精确匹配。 我知道我可以做一些事情,例如用 / 拆分 URI,用 * 替换变量部分,并使用 ANT 路径匹配器或类似的东西。 但我认为重新发明轮子和做已经完成的工作没有意义。 应用程序容器(或 web 容器或任何正式名称)可以将传入请求路由到正确的处理程序这一事实意味着它已经完成,并且用于执行此操作的工具已经可用或存在。 在写这篇文章时,我想到了另一个问题。 我想知道我是否应该尝试找到现有的工具,或者是否有其他更明智的方法来做到这一点,因为容器已经完成(或将要完成)URI 匹配。 这些不是我想出的,我很确定这些可能已经被考虑过了。我还没有找到解决方案,但也可能是我只是缺少正确的搜索词。 这发生在我提出问题并且有人发表评论之前,我已经得到了遗漏的词,这让我找到了解决方案。

看来我误解或理解错误 ANT 路径(很可能是过去使用 ANT 构建系统时的“创伤”和一般懒惰的结合)。 ANT 路径匹配正是我一直在寻找的工具,到目前为止它似乎对我的目的有用。 这是一个小代码片段,显示了我的目标(我当场修改了我的原始代码,对于任何重大错误,我们深表歉意):

@Component
@Order(Ordered.HIGHEST_PRECEDENCE - 1)
public class AuthorizationFilter extends OncePerRequestFilter
{
    private static final Logger LOG = LoggerFactory.getLogger(AuthorizationFilter.class);

    Private List<String> collectedEndpointPaths;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
    {
        LOG.trace("Checking authorization for [{}] {}", request.getMethod(), request.getRequestURI());
        for (String path : collectedEndpointPaths) {
            if((new AntPathMatcher()).match(path,z request.getRequestURI())) {
                // Do my magic
            }
        }
        filterChain.doFilter(request, response);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM