在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)
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)
应该是已经跳转了你还return
所以是那错误
dispatcher.forward(request, response);
return;
把你上面的跳页换成下面的这个试试!呵呵!
response.sendRedirect(request.getContextPath()+"/index.jsp");
return;
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.include(request, response);
out.close();
return;
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(); 注释掉 试试看
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
return;
加上 return null;试试
因为方法头是public void doFilter()是返回 void的此外,8楼说的把PrintWriter out = response.getWriter();
out.print(" <script>alert('不是该系统用户!请重新登录'); </script>");
out.close(); 注释掉 这样能跳转 但没有提示信息
out.print(" <script>alert('不是该系统用户!请重新登录'); </script>");
out.close(); 关键是这句啊大哥,你这段代码已经向client输出了,这个时候你怎么能在服务器端转发呢!把下面的代码加入到<script>alert('不是该系统用户!请重新登录');window.location.href="跳转页面"; </script>然后把下面的代码去掉
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
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;
java.lang.IllegalStateException 在非法或不适当的时间调用方法时产生的信号
不能跳转在response已经处理。。翻译下你就明白了吧?
这翻译别人可能太好理解!
大致的意思就是 向客户端输出之后无法转发