我阅读了 Tomasz Nurkiewicz 的答案,到目前为止,该答案已获得 22 人的支持。请注意,他回答 4 年前。
我想知道为什么我需要一个几乎是空的 xml 文件?
我尝试使用 Servlet 3 构建一个 hello world。
package com.servlet3;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/helloServlet3")
public class HelloServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h3>Hello Servlet</h3>");
out.print("</body></html>");
}
}
而且我能够成功运行这个小型网络应用程序。
重要提示:
请注意,此示例中不存在 web.xml。
所以,我们不需要需要这种几乎是空的 web.xml。
但是,web.xml 是强制的,如果你需要基于表单的身份验证(但是,没有 Spring 安全性)。因为,有 没有可用于<login-config> 的等效注释。
根据SO的这篇帖子
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login</form-login-page>
<form-error-page>/login?event=Retry</form-error-page>
</form-login-config>
</login-config>
... 配置基于表单的身份验证的唯一方法是使用部署描述符(web.xml 或 web-fragment.xml)。
根据 JSR-315 Servlet 3.0 规范 :: Ch13.6.3 (pg132):
"Web 应用程序部署描述符包含一个条目
登录表单和错误页面..."
规范仅指的是用于表单登录配置的 Web 部署描述符,而不指任何基于注释的配置。
更新:
以上删除信息与Java EE6有关。
在Java EE7中,我们可以做基于表单的身份验证编程方式..
来自 Java EE7 official tutorial,
48.3.1 以编程方式对用户进行身份验证
HttpServletRequest 接口的以下方法使您能够
以编程方式对 Web 应用程序的用户进行身份验证。
authenticate 允许应用程序发起对
容器从不受约束的请求中请求调用者
语境。登录对话框显示并收集用户名和
用于身份验证的密码。
login 允许应用程序收集用户名和密码
信息作为指定基于表单的身份验证的替代
在应用程序部署描述符中。
logout 允许应用程序重置呼叫者的身份
请求。