3

我有个问题。我知道如何在 servlet 中执行 JavaScript,但是当我想在我将用户重定向到另一端之后立即执行它时遇到了问题。所以这是代码,它显示了我的问题。我在 html 端使用提交按钮。

PrintWriter out = response.getWriter();  
response.setContentType("text/html");  
out.println("<script type=\"text/javascript\">");  
out.println("alert('the session did time out, please reconnect');");  
out.println("logout();");
out.println("</script>");    
request.getRequestDispatcher("/Login.jsp").forward(request, response);

现在发生的事情是,我将被重定向到我的登录页面,但我没有看到任何警报。但是当我删除转发行时会写

PrintWriter out = response.getWriter();  
response.setContentType("text/html");  
out.println("<script type=\"text/javascript\">");  
out.println("alert('the session did time out, please reconnect');");  
out.println("logout();");
out.println("</script>"); 
// the redirect is missing now

所以现在我收到了警报消息,但我被重定向到一个空白页面,因为根本没有重定向。

所以现在我正在尝试创建一个警报,它告诉用户警报中的某些内容。紧接着,我想将他重定向到登录页面,在那里我想调用我编写的“注销”功能。

但是我既没有收到警报,也没有调用注销功能。基于这个问题,这应该有效

4

1 回答 1

5
现在发生的事情是,我将被重定向到我的登录页面,但我这样做了
没有看到任何警报。

查看RequestDispatcher#forward()的 javadoc 。

forward 应该在响应提交给客户端之前调用(在刷新响应主体输出之前)。如果已提交响应,则此方法将引发 IllegalStateException。响应缓冲区中未提交的输出在转发之前会自动清除。

因此,当您 时forward(),电流response不会提交给客户端,因此您的html代码javascript不会运行。转发意味着您当前的 Servlet 没有处理request,转发的代码应该处理它,因此您看不到out.println()当前 Servlet 内部写入的任何内容作为最终响应的一部分。Tjis 正在转发请求,并且是在服务器端本身完成的,这不是由浏览器发起的重定向。要重定向,您需要使用HttpServletResponse#sendRedirect

所以现在我收到警报消息,但我被重定向到
空白页

您不会被重定向到任何页面,请仔细检查您写入响应的内容:

out.println("<script type=\"text/javascript\">");  
out.println("alert('the session did time out, please reconnect');");  
out.println("logout();");
out.println("</script>"); 

在这种情况下,浏览器会收到类似这样的 HTML 代码:

<html>    
<script type="text/javascript">  
 alert('the session did time out, please reconnect');  
 logout();
</script> 

此代码将仅显示警报和调用logout()函数(如果有)。它以当前形式显示没有任何可视内容的 HTML 页面。

于 2013-05-10T09:12:26.477 回答