我现在正在寻找多语言Web应用程序的框架.目前在我看来,最好的选择是Spring MVC.但是我面对的事实是开发人员的所有指导方针都建议使用LocaleChangeInterceptor以这种方式切换语言:
http://www.somesite.com/action/?locale=en
不幸的是,我想避免这种情况有很多原因.我怎样才能使语言代码成为URL的重要组成部分?例如:
http://www.somesite.com/en/action
谢谢.
UPD:我找到了以下解决方案.它尚未完成,但有效.解决方案包括两部分 - servlet过滤器和区域设置解析器bean.它看起来有点hackish,但我没有看到解决这个问题的其他方法.
public class LocaleFilter implements Filter
{
...
private static final String DEFAULT_LOCALE = "en";
private static final String[] AVAILABLE_LOCALES = new String[] {"en", "ru"};
public LocaleFilter() {}
private List<String> getSevletRequestParts(ServletRequest request)
{
String[] splitedParts = ((HttpServletRequest) request).getServletPath().split("/");
List<String> result = new ArrayList<String>();
for (String sp : splitedParts)
{
if (sp.trim().length() > 0)
result.add(sp);
}
return result;
}
private Locale getLocaleFromRequestParts(List<String> parts)
{
if (parts.size() > 0)
{
for (String lang …Run Code Online (Sandbox Code Playgroud) 我必须在Websockets上实现自定义API,这需要:
所以我有以下问题:
将路径参数传递给消息处理程序的正确方法是什么?我可以在处理程序注册中使用ant模式
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(customHandler(), "/api/custom/{clientId}");
}
Run Code Online (Sandbox Code Playgroud)
但是TextWebSocketHandler似乎没有.我现在通过以下方式扩展默认的HttpSessionHandshakeInterceptor来解决这个问题:
public class CustomHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
private static final UriTemplate URI_TEMPLATE = new UriTemplate("/api/custom/{clientId}");
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
Map<String, String> segments = URI_TEMPLATE.match(request.getURI().getPath());
attributes.put("CLIENTID", segments.get("clientId"));
return super.beforeHandshake(request, response, wsHandler, attributes);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在TextWebSocketHandler中访问它:
public class CustomHandler extends TextWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
String clientId …Run Code Online (Sandbox Code Playgroud)