You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何全局为Thymeleaf路由添加路径变量locale,无需Model传参?

全局自动为路由添加Locale前缀的解决方案

完全可以全局实现这个需求,你提到的RequestDataValueProcessor是正确的技术方向,通过它可以拦截所有生成的URL,自动拼接Locale前缀,同时过滤掉绝对URL和静态文件链接,不需要在每个控制器里手动往Model里传Locale属性。

具体实现步骤

1. 自定义RequestDataValueProcessor处理器

这个处理器会接管URL的生成逻辑,区分不同类型的URL并做对应处理:

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.servlet.support.RequestDataValueProcessor;

public class LocalePrefixUrlProcessor implements RequestDataValueProcessor {

    private final RequestDataValueProcessor delegate;

    // 注入默认处理器,保留原有功能(比如CSRF令牌处理)
    public LocalePrefixUrlProcessor(RequestDataValueProcessor delegate) {
        this.delegate = delegate;
    }

    @Override
    public String processUrl(HttpServletRequest request, String url) {
        // 跳过绝对URL(http/https开头)
        if (url.startsWith("http://") || url.startsWith("https://")) {
            return url;
        }

        // 跳过静态文件链接,根据你的实际静态资源前缀调整
        String[] staticPrefixes = {"/images/", "/css/", "/js/", "/static/"};
        for (String prefix : staticPrefixes) {
            if (url.startsWith(prefix)) {
                return url;
            }
        }

        // 从请求中获取当前Locale(URI路径变量)
        var uriVars = (java.util.Map<String, String>) request.getAttribute(
            "org.springframework.web.servlet.HandlerMapping.uriTemplateVariables"
        );
        String locale = uriVars.getOrDefault("locale", "en"); // 兜底默认Locale

        // 拼接Locale前缀,处理URL开头的斜杠
        if (url.startsWith("/")) {
            return "/" + locale + url;
        } else {
            return "/" + locale + "/" + url;
        }
    }

    // 以下方法直接委托给默认处理器,保持原有功能
    @Override
    public String processAction(HttpServletRequest request, String action) {
        return delegate.processAction(request, action);
    }

    @Override
    public String processFormFieldValue(HttpServletRequest request, String name, String value, String type) {
        return delegate.processFormFieldValue(request, name, value, type);
    }

    @Override
    public java.util.Map<String, String> getExtraHiddenFields(HttpServletRequest request) {
        return delegate.getExtraHiddenFields(request);
    }
}

2. 注册自定义处理器到Spring容器

在配置类中把自定义处理器注册为Bean,Spring会自动用它替换默认的处理器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.support.RequestDataValueProcessor;

@Configuration
public class WebMvcConfig {

    @Bean
    public RequestDataValueProcessor localePrefixUrlProcessor(RequestDataValueProcessor defaultProcessor) {
        return new LocalePrefixUrlProcessor(defaultProcessor);
    }
}

关键说明

  • URL类型区分:通过判断URL开头的前缀,确保绝对URL和静态文件链接不被修改,只处理业务路由链接。
  • Locale获取方式:直接从请求的路径变量中获取,不需要额外从Model或其他地方传递,完全全局化。
  • 兼容性:通过委托默认处理器,保留了Spring MVC原有功能(比如表单提交的CSRF令牌处理),不会影响其他功能。
  • 模板无需修改:Thymeleaf的@{/}、@{/xxx}等路由链接会自动生成为/{locale}/、/{locale}/xxx,不需要手动修改模板代码。

内容的提问来源于stack exchange,提问作者Bademeister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:57:11