在servelet的doGet()或doPost()调用RequestDispatcher的forward(request, response)都没有问题,在该类中,弹出信息也没有问题,就是不跳转到指定的登陆页面index.jsp。下面是代码和tomcat的错误信息:请教高手,谢谢! 
   import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;public class OnlineFilter implements Filter
{ public OnlineFilter()
{
} public void destroy()
{
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
response.setCharacterEncoding("utf-8");//解决中文乱码 HttpServletRequest req =(HttpServletRequest)request;
HttpSession session =req.getSession(true);
   // HttpServletResponse res = (HttpServletResponse) response; 
// 从session 里面获取用户名的信息
String user =(String)session.getAttribute("loginname");
user=req.getParameter("userId");
if(user == null || "".equals(user))
{
PrintWriter out = response.getWriter(); 
out.print("<script>alert('不是该系统用户!请重新登录');</script>");
out.close();

 //跳转到登陆页面 index.jsp在webRoot根目录下
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response); 
return;
}
else
{
    chain.doFilter(request, response);
}
} public void init(FilterConfig config) throws ServletException
{
}
}——————————————————————————————————————————————严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:312)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)

解决方案 »

  1.   

    把return给去掉
    应该是已经跳转了你还return
    所以是那错误
      

  2.   

    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
    dispatcher.forward(request, response);
    return; 
    把你上面的跳页换成下面的这个试试!呵呵!
    response.sendRedirect(request.getContextPath()+"/index.jsp");
    return;
      

  3.   

    out.print(" <script>alert('不是该系统用户!请重新登录'); </script>");//跳转到登陆页面 index.jsp在webRoot根目录下
    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
    dispatcher.include(request, response);
    out.close();
    return; 
      

  4.   

    多谢autoforev,页面能跳转,但弹出信息没有执行(out.print(" <script>alert('不是该系统用户!请重新登录'); </script>"); )
      

  5.   

    跳转和out.print不可以同时生效
      

  6.   

    PrintWriter out = response.getWriter(); 
    out.print(" <script>alert('不是该系统用户!请重新登录'); </script>"); 
    out.close(); //跳转到登陆页面 index.jsp在webRoot根目录下 
    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp"); 
    dispatcher.forward(request, response); 
    return; 
    错误都说了 你调用out.close()已经把这个通道关闭了 怎么还forward?
    你把PrintWriter out = response.getWriter(); 
    out.print(" <script>alert('不是该系统用户!请重新登录'); </script>"); 
    out.close(); 注释掉 试试看
      

  7.   

    out.close();  你都关闭了,然后下面的又开始跳转了。这个//跳转到登陆页面 index.jsp在webRoot根目录下
    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
    dispatcher.forward(request, response);
    return; 
    加上 return null;试试
      

  8.   

    return null;会编译错误,
    因为方法头是public void doFilter()是返回 void的此外,8楼说的把PrintWriter out = response.getWriter(); 
    out.print(" <script>alert('不是该系统用户!请重新登录'); </script>"); 
    out.close(); 注释掉  这样能跳转  但没有提示信息
      

  9.   

    PrintWriter out = response.getWriter(); 
    out.print(" <script>alert('不是该系统用户!请重新登录'); </script>"); 
    out.close(); 关键是这句啊大哥,你这段代码已经向client输出了,这个时候你怎么能在服务器端转发呢!把下面的代码加入到<script>alert('不是该系统用户!请重新登录');window.location.href="跳转页面"; </script>然后把下面的代码去掉
    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp"); 
    dispatcher.forward(request, response); 
      

  10.   

    PrintWriter out = response.getWriter(); 
    out.print(" <script>alert('不是该系统用户!请重新登录'); </script>"); 
    out.close(); //跳转到登陆页面 index.jsp在webRoot根目录下 
    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp"); 
    dispatcher.forward(request, response); 
    return; 改PrintWriter out = response.getWriter(); 
    out.print(" <script>alert('不是该系统用户!请重新登录');window.location.href="跳转页面"; </script>"); 
    out.close(); 
    return; 
      

  11.   

    java.lang.IllegalStateException: Cannot forward after response has been committed 
    java.lang.IllegalStateException 在非法或不适当的时间调用方法时产生的信号 
     不能跳转在response已经处理。。翻译下你就明白了吧?
      

  12.   

    在非法或不适当的时间调用方法时产生的信号不能跳转在response已经处理
    这翻译别人可能太好理解!
    大致的意思就是     向客户端输出之后无法转发
      

  13.   

    没在过滤器里使用过out对象..真不知道要是显示的话他是在什么地方显示..
      

  14.   

    已经结贴散分  多谢! out.print("<script>window.location='/index.jsp'; </script>");理论上能行  但至少思路是对的