Java Spring拦截器不适用于部分REST端点
我有一个Spring引导应用程序,REST端点定义如下Java Spring拦截器不适用于部分REST端点,java,rest,spring-mvc,interceptor,Java,Rest,Spring Mvc,Interceptor,我有一个Spring引导应用程序,REST端点定义如下 /usermanagement/v1/access/ldap /usermanagement/v1/access/db 我创建了一个Spring拦截器,用以下模式截获所有传入的请求 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestInterceptor()).addPath
/usermanagement/v1/access/ldap
/usermanagement/v1/access/db
我创建了一个Spring拦截器,用以下模式截获所有传入的请求
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/usermanagement/v1/**");
}
请求拦截器
@Component
public class RequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
System.out.println("This is Post Handling the request");
}
}
只有当客户端访问完整的端点(即
/用户管理/v1/access/ldap
如果访问了部分端点
/用户管理/v1/access
不会调用拦截器,并将404返回给客户端
有没有办法改变这种行为?我这样做的原因是,我不想公开特定的端点,而是公开公共端点,对服务进行内部调用,并通过公共端点返回结果。您使用了错误的方法。尝试使用
afterCompletion
而不是postHandle
new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//This is called before handeling any request
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//This is called after successfully handeling a request. It will not be called in case of an exception
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//This will always be called after a request, even in case of an exception
}
}
对未定义端点的请求
/usermanagement/v1/access
Spring将引发异常。因此,它永远不会进入postHandle
您是否在/usermanagement/v1/access
上定义了任何资源访问权限?@HerrDerb不,我没有,但因为它与要拦截的模式匹配,应该调用拦截器。您在请求拦截器中执行预处理
还是后处理
?使用/usermanagement/v1/access
返回什么?ldap还是数据库资源?我觉得您根本不需要拦截器。@HerrDerb是的,我的拦截器中有它们的空实现。我使用/usermanagement/v1/access
作为公共端点。之后,请求将被解析并在内部转发到相应的服务,具体取决于请求头和请求体中的值。因此,请求将转发到未定义的/usermanagement/v1/access
,Spring将为您提供一个404
,这是正确的。还是我误解了什么?您可以添加处理程序的源吗?可能不会调用任何方法。你在你那边试过这个吗?我只是在找这个。谢谢:)