2016-02-25 100 views
0

我的JSP位置是src/webcontent/WEB-INF/jsp/sessionTimeout.jspSendRedirect后未找到JSP

在我从一个过滤器执行如下的sendRedirect后没有找到它。我已经尝试了这些组合:

((HttpServletResponse)response).sendRedirect("/WEB-INF/jsp/sessionTimeout.jsp"); 
((HttpServletResponse)response).sendRedirect("sessionTimeout.jsp"); 
((HttpServletResponse)response).sendRedirect("jsp/sessionTimeout.jsp"); 
((HttpServletResponse)response).sendRedirect(((HttpServletRequest)request).getContextPath() + "/jsp/sessionTimeout.jsp"); 

404错误。代码:

public class SpringMVCControllerFilter implements Filter 
{ 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException   
{ 
     if (session.isValid() && !session.isNew()) 
     { 
      chain.doFilter(request, response); 
     } 
     else 
     {    ((HttpServletResponse)response).sendRedirect("jsp/sessionTimeout.jsp"); 
     } 


    } 
} 

回答

1

WEB-INF下的所有内容都是无法从外部访问的。把它放在你喜欢的任何地方,除非你想从浏览器访问它。

由于JSP是视图,因此JSP通常置于WEB-INF下,并且请求应始终发送给准备模型并调度到视图的控制器。

+0

对不起,我一开始并不清楚。我们的结构是src/webcontent/WEB-INF/...,所以我相信应该找到它。我编辑了原文。我有一个解决方案,出于某种原因,而这一个没有,见下面我的答案。 –

+1

Web内容在您的源项目中构成Web应用程序的根目录。您的解决方案可以工作,因为它将当前请求分发(转发)到JSP。重定向与前向完全不同:它要求浏览器向JSP发送新请求。由于它无法从外部访问,因此失败。 –

+0

那么为什么所有关于此主题的示例都给出sendRedirect(“/ page.jsp”),其中每个人都将其JSP放置在通常不可访问的WEB-INF位置?我已经看到了数以千计的sendRedirect示例,根本不会这么做。 –

0

这终于为我工作:

request.getRequestDispatcher("/WEB-INF/jsp/sessionTimeout.jsp").forward(request, response); 

,而这从原来的职位都没有,没有一个组合的下方工作(有没有的sendRedirect):

((HttpServletResponse)response).sendRedirect("/WEB-INF/jsp/sessionTimeout.jsp"); 
((HttpServletResponse)response).sendRedirect("sessionTimeout.jsp"); 
((HttpServletResponse)response).sendRedirect("jsp/sessionTimeout.jsp"); 

我将使用RequestDispatcher,但仍不确定为什么sendRedirect总是无法重定向到JSP。