Tomcat- Servlet 没有打印所有内容
Tomcat- Servlet not printing everything
我有下面的代码,用于在进行 BASIC 身份验证时打印输入的用户名和密码,但是当我将代码修改为 java 程序有效。下面是认证成功后浏览器的输出。
下面还有我使用的Servlet代码。
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Base64;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is the Test Servlet");
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = (String) headerNames.nextElement();
out.print("<br/>Header Name: <em>" + headerName);
String headerValue = request.getHeader(headerName);
out.print("</em>, Header Value: <em>" + headerValue);
out.println("</em>");
}
out.println("<hr/>");
String authHeader = request.getHeader("authorization");
out.println("User and Password in Base64 encoding--------------------------->>>" + authHeader);
//String encodedValue = authHeader.split(" ")[1];
String encodedValue = authHeader;
//byte arr[] = Base64.decodeBase64(encodedValue);
byte[] asBytes = Base64.getDecoder().decode(encodedValue);
out.println(new String(asBytes, "utf-8"));
out.println("Not printing ????");
out.println("</em>");
}
}
此行触发问题:
out.println(new String(asBytes, "utf-8"));
因为String没有这样的构造函数。您可能打算使用 this constructor:
out.println(new String(asBytes, Charset.forName("UTF-8")));
尝试关闭并刷新输出对象。
out.close();
out.flush();
我希望这会在屏幕上打印输出。
您的 servlet 中可能有错误导致执行突然停止。
您在浏览器中看不到漂亮的错误消息的原因 window 是因为您的 servlet 已产生足够的输出来填充内部响应缓冲区,因此缓冲区已被刷新,"committing" 响应(这是一个半技术术语,至少就 servlet 规范而言)。
一旦响应已经"committed"(也就是说,第一个字节已经发送到客户端),你不能改变响应状态码,任何头等,所以没有办法告诉客户有什么东西坏了,而不是破坏页面输出本身。
当事情开始变得有趣时,最好查看日志。
我有下面的代码,用于在进行 BASIC 身份验证时打印输入的用户名和密码,但是当我将代码修改为 java 程序有效。下面是认证成功后浏览器的输出。
下面还有我使用的Servlet代码。
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Base64;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is the Test Servlet");
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = (String) headerNames.nextElement();
out.print("<br/>Header Name: <em>" + headerName);
String headerValue = request.getHeader(headerName);
out.print("</em>, Header Value: <em>" + headerValue);
out.println("</em>");
}
out.println("<hr/>");
String authHeader = request.getHeader("authorization");
out.println("User and Password in Base64 encoding--------------------------->>>" + authHeader);
//String encodedValue = authHeader.split(" ")[1];
String encodedValue = authHeader;
//byte arr[] = Base64.decodeBase64(encodedValue);
byte[] asBytes = Base64.getDecoder().decode(encodedValue);
out.println(new String(asBytes, "utf-8"));
out.println("Not printing ????");
out.println("</em>");
}
}
此行触发问题:
out.println(new String(asBytes, "utf-8"));
因为String没有这样的构造函数。您可能打算使用 this constructor:
out.println(new String(asBytes, Charset.forName("UTF-8")));
尝试关闭并刷新输出对象。
out.close();
out.flush();
我希望这会在屏幕上打印输出。
您的 servlet 中可能有错误导致执行突然停止。
您在浏览器中看不到漂亮的错误消息的原因 window 是因为您的 servlet 已产生足够的输出来填充内部响应缓冲区,因此缓冲区已被刷新,"committing" 响应(这是一个半技术术语,至少就 servlet 规范而言)。
一旦响应已经"committed"(也就是说,第一个字节已经发送到客户端),你不能改变响应状态码,任何头等,所以没有办法告诉客户有什么东西坏了,而不是破坏页面输出本身。
当事情开始变得有趣时,最好查看日志。