【问题标题】:Spring 3 HandlerInterceptorAdapter. Request ends with 404 beforecalling interceptorSpring 3 处理程序拦截器适配器。在调用拦截器之前请求以 404 结束
【发布时间】: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


    【解决方案1】:

    在确定是否存在映射之前,它无法真正将每个传入请求发送到拦截器。请注意,拦截器的参数之一是控制器本身!如果传入的 URL 没有映射到任何地方,它应该如何知道将作为方法参数传入的处理程序?在请求到达调度程序 servlet 之前,需要在堆栈的更深处完成 URL 重写。例如,servlet filter for that purpose

    另一种可能的选择是以这种方式映射您的控制器

    @RequestMapping(value="/{languageCode}/car", method = RequestMethod.GET)
    

    只要您在同一调度程序中没有其他 /something/car 映射会发生冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多