该站点是在纯 servlet 上编写的,没有使用任何框架。当打开任何页面时,该页面的 servlet 会执行 2 次或更多次。
是什么原因?
注解中的 Servlet 映射。例如,对于主页:
索引.java
@WebServlet(name = "index", urlPatterns = {"/index.html"})
public class Index extends AbstractServlet {
protected static char[] page;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doResponse(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doResponse(request, response);
}
@Override
protected void preparePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StringBuilder stringBuilder = new StringBuilder();
... creating page from template ...
setPage(stringBuilder.toString().toCharArray());
}
}
AbstractServlet.java
public abstract class AbstractServlet extends HttpServlet {
protected char[] getPage() throws ServletException, IOException {
return (char[]) this.getClass().getField("page").get(this.getClass());
}
protected void setPage(char[] page) {
this.getClass().getField("page").set(this.getClass(), page);
}
protected void doResponse(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
if (this.getPage() == null) {
this.preparePage(request, response);
}
pw.write(this.getPage());
}
protected abstract void preparePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
第一个请求标头的屏幕截图

第二个请求标头的屏幕截图

客户端在消息
referrer: http://localhost/index.php中指出,这意味着第一个请求发起了第二个请求(这是身份验证、重定向或其他错误)。您现在可以看到浏览器正在对
/index.html. 但服务器响应没有标头Redirect /index.html,响应代码为 200。因此响应正文包含以下文本:或其他链接
/index.html。并且根据Accept有一个图片请求来判断。如果没有,请将第一条服务器消息的“正文”附加到问题中,线索就在其中。
servlet 非常正常地处理两个不同的请求: