在Spring拦截器中设置自定义响应

时间:2016-01-01 06:09:18

标签: spring spring-mvc session interceptor

这是我的拦截器方法,我想设置自定义响应以告诉UI发生了什么

@Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
    HttpSession session = request.getSession(false);
    if (session != null) 
         return true;
        else{
        response.sendError(HttpServletResponse.SC_REQUEST_TIMEOUT)
        return false;
        }
    }

在web.xml中

<error-page>
    <error-code>408</error-code>
    <location>/error.html</location>
</error-page>

弹簧servlet.xml中

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <mvc:exclude-mapping path="/login" />
            <bean class="com.example.CustomInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

当会话超时时,返回false后不发送任何响应。 即使以下也不起作用

response.sendRedirect("http://localhost:8080/home");

1 个答案:

答案 0 :(得分:0)

你可以尝试非常简单的事情。将您的mvc:interceptros结构更改为

<mvc:interceptors>
     <bean class="com.example.CustomInterceptor" />
</mvc:interceptors>

这实际上意味着将拦截器应用于所有适用的请求。我会在片刻之前说出为什么我说适用。如果以上工作,则问题在于您的映射。

现在您知道拦截器的配置级别为HandlerMapping,并且RequestMappingHandlerMapping(Spring 3.1+ with mvc:annotation-driven)或DefaultAnnotationHandlerMapping。< / p>

现在您使用<mvc:mapping path="/**" />将映射到所有请求(包括子路径),只要它们是有效映射。所以假设你有控制器

@RequestMapping(value="/home", method = RequestMethod.GET)
public String welcome() {
    return "welcome";
}

你无法点击http://localhost:8080/yourProjectName/home/test并期望它击中拦截器。因此,您必须点击http://localhost:8080/yourProjectName/home,因为这是一个有效的HandlerMapping。

如果您的拦截器遇到任何请求,则响应第一次调试。如果它确实有效,那么

response.sendError(HttpServletResponse.SC_REQUEST_TIMEOUT);

应该将您重定向到使用

error.html
<error-page>
    <error-code>408</error-code>
    <location>/error.html</location>
</error-page>