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:如何在拦截器中获取路径变量?的主要内容,如果未能解决你的问题,请参考以下文章

ServletContext 和 Spring MVC

spring mvc拦截器:访问postHandle中的ResponseEntity

如何在spring mvc控制器中获取getServletContext()

如何让 Spring MVC 读取日期为“2019-3-29”格式的路径参数?

我的javaEE项目的spring mvc controller里如何获取某个文件夹的路径呢?

spring mvc中的拦截器,怎样获取reqeust中的json数据