Spring mvc 3:如何在拦截器中获取路径变量?
Posted
技术标签:
【中文标题】Spring mvc 3:如何在拦截器中获取路径变量?【英文标题】:Spring mvc 3 : How to get path variable in an interceptor? 【发布时间】:2012-08-28 07:13:05 【问题描述】:在 Spring MVC 控制器中,我可以使用 @PathVariable 获取路径变量,以获取在 @RequestMapping 中定义的变量的值。如何在拦截器中获取变量的值?
非常感谢!
【问题讨论】:
【参考方案1】:在 Spring 论坛中有一个 thread,有人说,没有“简单的方法”,所以我想你必须解析 URL 才能得到它。
【讨论】:
其实上面@ashario (***.com/a/23468496/35274) 的回答表明是可以做到的。【参考方案2】:晚了将近 1 年,但是:
String[] requestMappingParams = ((HandlerMethod)handler).getMethodAnnotation(RequestMapping.class).params()
for (String value : requestMappingParams) ...
应该有帮助
【讨论】:
这对于检索 RequestParams 似乎很有用,但我不知道如何使用这种方法获取 PathVariables 的值【参考方案3】:Pao 链接的帖子对我很有帮助
在 preHandle() 方法中,您可以通过运行以下代码来提取各种 PathVariables
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
【讨论】:
然后String value= (String) pathVariables.get("yourPathVarName");
就是这样。这应该被标记为答案
完美,示例代码也适用于@ControllerAdvice
和@ExceptionHandler
。谢谢
有没有办法在 preHandle 方法中更新这个路径变量?例如:“yourPathVarName from”的值 test【参考方案4】:
添加拦截器。
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.TreeMap;
@Component
public class MyHandlerInterceptor extends HandlerInterceptorAdapter
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
Map map = new TreeMap<>((Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE));
Object myPathVariableValue = map.get("myPathVariableName");
// some code around myPathVariableValue.
return true;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception
注册拦截器。
import com.intercept.MyHandlerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@ConditionalOnProperty(name = "mongodb.multitenant.enabled", havingValue = "false")
public class ResourceConfig implements WebMvcConfigurer
@Autowired
MyHandlerInterceptor webServiceTenantInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry)
registry.addInterceptor(webServiceTenantInterceptor);
有了这个,您将能够通过您为所有请求的路径变量指定的名称读取@PathVariable。
【讨论】:
以上是关于Spring mvc 3:如何在拦截器中获取路径变量?的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc拦截器:访问postHandle中的ResponseEntity
如何在spring mvc控制器中获取getServletContext()
如何让 Spring MVC 读取日期为“2019-3-29”格式的路径参数?