如何不通过URL显示跟踪用户数据?多语言搜索留存Locale方案
问题2:Spring Web应用搜索时保留Locale参数
你之前用<spring:message>标签的方案无效,本质是静态配置的链接无法动态适配当前用户的Locale,而且表单提交的参数拼接逻辑也没处理好。下面给你几个可行的解决方案:
方案1:用Spring JSTL标签动态拼接URL
借助<c:url>和<spring:param>标签,可以自动获取当前请求的Locale并拼接参数:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <form action="<c:url value='/user/search'> <spring:param name='lang' value='${pageContext.request.locale}'/> </c:url>" method="get"> <input type="text" name="search" placeholder="输入搜索内容"/> <button type="submit">搜索</button> </form>
${pageContext.request.locale}会自动获取当前请求的Locale对象,转换成de或en这类语言代码,提交表单后会生成/user/search?lang=de&search=pax的URL(参数顺序不影响功能,浏览器能正确解析)。
方案2:Thymeleaf模板场景(推荐)
如果你用的是Spring Boot常用的Thymeleaf,它的URL表达式能更简洁地处理Locale参数:
<form th:action="@{/user/search(lang=${#locale.language})}" method="get"> <input type="text" name="search" placeholder="输入搜索内容"/> <button type="submit">搜索</button> </form>
${#locale.language}是Thymeleaf提供的工具对象,直接获取当前Locale的语言代码,提交后会自动把lang参数和表单的search参数拼接在一起。
为什么之前的<spring:message>方案无效?
你静态配置的user.search.movie.link是固定值,比如messages_de.properties里写/user/search?lang=de,但如果用户动态切换了语言,页面渲染时可能没正确加载对应Locale的属性文件;另外即使加载正确,表单的GET请求会把静态URL的参数和表单参数拼接成/user/search?lang=de&search=pax(这其实是正确的,参数顺序不影响功能)。但动态获取当前Locale的方式更灵活,能适配用户随时切换语言的场景。
内容的提问来源于stack exchange,提问作者Senio Vak
相关产品推荐
相关产品推荐

