Spring MVC Interceptor排除HTTP方法

时间:2016-03-18 19:11:49

标签: java spring spring-mvc

我有一些拦截器需要在对我的API执行的一些请求中检查标头和授权。例如,某些请求应该要求用户身份验证(例如,从数据库更改用户详细信息),而有些请求不需要身份验证(例如,创建用户)。不幸的是,从拦截器中排除路径的方法不依赖于请求方法。

现在我已经创建了一个Util类,它接收应该从验证中排除的路径和方法字符串数组。例如:"POST /api/users"不应被我的身份验证拦截器截获,因为它是用于创建用户,但"PUT /api/users"应该被拦截,因为它用于更改现有用户(应该登录的用户)。 / p>

public static Boolean skipVerification(HttpServletRequest request, String... skipRequests) {
    for (String string : skipRequests) {
        String[] split = string.split(" ");
        if(split[0].equals(request.getMethod()) && split[1].equals(request.getRequestURI()))
            return true;
    }
    return false;
}

在我的拦截器的构造函数中,我添加了应该跳过的请求,并且在PreHandle方法中,如果请求与其中任何一个匹配,则返回true,因为它们首先不需要我拦截。

public AuthenticationHeaderInterceptor(String...skipWhen) {
    this.skipWhen = skipWhen;
}

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {

    if(InterceptorUtils.skipVerification(request, skipWhen))
        return true;

///Do Authentication Logic

}

我知道更改用于创建和编辑用户的URI会解决这个问题,但我不希望我的API混乱太多,并且想知道是否有更简洁的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

查看代码,我正在检查您是否能够扩展InterceptorRegistryInterceptorRegistrationMappedInterceptor。您还必须扩展PathMatcher并合并代码以检查方法以及PathMatcher不适用的路径。总的来说,你目前的做法可能是最好的。我还要指出Spring的代码AntPathMatcher一直非常混乱和错误,所以你可能不想承担任何涉及处理它的任务。