在提交响应后无法调用sendRedirect()

时间:2013-12-01 18:10:45

标签: java jsp servlets servlet-filters

我有一个过滤器,用于检查会话是否存在。如果它不存在,我会将用户response.sendRedirect()重定向到登录页面。

在某些页面中它起作用,在其他页面中它不起作用。我收到此错误Cannot call sendRedirect() after the response has been committed

似乎如果我在我的jsp页面中删除代码的某些部分,例如<%=variable%>,它就可以工作了。 但是,正如我所说,在其他jsp页面中,即使我有像<%=variable%>这样的代码也能正常工作。 我真的无法理解这是什么问题。

我在这个论坛上看了一些类似的帖子,但我找不到解决方案。

这是我的过滤器

public class SessionFilter implements Filter {

    public void destroy() {}

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        try {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            String url = request.getServletPath();

            HttpSession session = request.getSession(false);

            /*caso in cui il webserver non abbia ancora creato la sessione*/
            if (null == session) {
                reindirizza = true;
            } else {
                /*caso in cui il webserver abbia creato la sessione e l'utente  sia loggato*/
                if(session.getAttribute("loggato")!=null && session.getAttribute("loggato").equals("si")) {
                    reindirizza = false;
                }
                /*caso in cui il webserver abbia creato la sessione e l'utente  non sia loggato*/
                else {
                    reindirizza = true;
                }
            }

            chain.doFilter(req, res);
            if(reindirizza) {
                response.sendRedirect("Gestione.jsp?message=Sessione scaduta o non valida. Effettuare il Login");
            }
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public void init(FilterConfig config) throws ServletException { }
}

3 个答案:

答案 0 :(得分:2)

response.sendRedirect("jsppage")之后我也会遇到同样的问题,你应该像

那样返回它
return;

sendredirect方法之后添加上述语句,然后添加无问题。

答案 1 :(得分:0)

我也常常遇到相同类型的问题,即在提交响应后无法调用sendRedirect()/ forward

错误有点误导,但实际发布的是jsp中jstl标签的一些不当使用。例如,标签未正确终止。因此,请检查所有标签是否形状正确

答案 2 :(得分:0)

在这里,你需要关闭你在jsp中打开的所有out.println和out.flush语句。这应该可以解决您的问题。