【发布时间】:2011-07-26 17:54:00
【问题描述】:
我正在编写自定义处理程序拦截器,以便拥有多语言 url 地址。比如用户访问uri/de/auto会出现deutsch内容,用户访问/en/car会出现英文内容。我希望两个请求都重定向到相同的控制器和相同的方法:
@Controller
public class MultiLangController {
@RequestMapping(value="/en/car", method = RequestMethod.GET)
public @ResponseBody String writePage() {
return "some content";
}
我的拦截器是这样实现的(简化版):
public class MultiLangInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String requestUrl = request.getRequestURI().substring(request.getContextPath().length());
if ("/de/auto".equals(requestUrl)) {
String redirect = request.getContextPath() + "/en/car";
response.sendRedirect(redirect);
return false;
}
return true;
}
}
现在,当我在浏览器中访问 /en/car url 时,返回正确的页面(带有消息“一些内容”)并且日志显示请求通过了我的拦截器。当我访问/de/auto 时,返回 404 错误并且根据日志请求没有到达我的拦截器。 但是为什么呢?请求不应该通过所有拦截器,直到其中一个通过返回 false 来阻止它?
为了清楚起见,我没有使用mvc:annotation-driven,因为它是hidding my custom interceptor。我已经手动定义了所有
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<ref bean="multiLangInterceptor" />
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
<ref bean="stringHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
<bean id="multiLangInterceptor" class="example.MultiLangInterceptor" />
<bean id="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter"/>
感谢您的回答!
【问题讨论】:
标签: java spring url interceptor multilingual