这是我的拦截器方法,我想设置自定义响应以告诉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");
答案 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>