1 Servlet 部署
Servlet规范关于各个东西该放在哪里有许多严格的规则。
1.1 WAR
war文件代表Web归档(Web Archive),war实际就是一个JAR,只不过扩展名是.war而不是.jar。
其采用了一种可移植的压缩形式,把整个Web应用结构(去掉Web应用上下文目录,也就是把WEB-INF之上的一级目录去掉)压缩起来。
1.1.1 声明库依赖性
war独有的特性就是声明库依赖性。
可以在META-INF/MANIFEST.MF文件中声明库依赖性,这样在部署时就能检查容器能否找到应用依赖的包和类,如果没找到,则不能部署。(这样做的好处是,当请求到来时,如果容器在其类路径中没有找到所请求资源需要的特定类,就会出现问题,而通过这个就会将这个问题暴露在部署时,而不是到真正的运行时)
1.2 Servlet映射
WEB-INF 或META-INF下的任何内容都不能直接访问。
ServletContext中的getResource()和getResourceAsStream()两个方法只用于Web应用中未部署在JAR文件中的资源。
1.2.1 映射规则
首先查找完全评判,然后是查找目录匹配,最后才是扩展名匹配。
如果一个请求与多个目录<url-pattern>匹配,容器会选择最长的匹配。
1.3 配置页面
按顺序指定一个页面列表,容器总是按同一个列表查找。对于部分请求指定的目录,容器按你指定的页面顺序在这个目录中查找。
<welcome-file-list>可配置多个文件(不能以斜线开头)
1.3.1 配置错误页面
1,声明一个“普遍”型错误页面
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/errorPage.jsp</location>
</error-page>
2,为更明确的异常声明一个错误页面
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/ati.jsp</location>
</error-page>
3,根据一个HTTP状态码声明错误页面
<error-page>
<error-code>404</error-code>
<location>/noPage.jsp</location>
</error-page>
1.4 DD中配置servlet初始化
servlet默认会在每一个请求到来时初始化。这说明,第一个客户要承受类加载、实例化和初始化等一系列开销,然后容器才能正常工作:分配一个线程,并调用servlet的service()方法。
如果想在部署时加载servlet,可以在DD中使用<load-on-startup>元素。<load-on-starup>非负值意味着要早加载及servlet的加载顺序。
2 web应用安全
servlet安全的四大要素:认证、授权、机密性和数据完整性。
图 第一次发起请求时HTTP的认证步骤
图 携带认证信息发起请求后HTTP的认证步骤
图 没有携带口令发起请求,容器认证授权步骤
图 携带口令发起请求,容器认证授权步骤
2.1 认证
基本BASIC | 以一种编码形式(base64未加密)传输登陆信息。安全性很弱。 |
摘要DIGEST | 以一种更安全的方式传输登陆信息。 |
客户证书CLIENT-CERT | 以一种非常安全的形式传输登陆信息,它使用了公共密钥证书。缺点是,你的客户必须先有一个证书才能登陆你的系统。 |
表单FORM | 前面3种认证都使用了浏览器的标准弹出表单来输入用户名和口令。而表单认证允许你利用合法的HTML建立自己的定制登陆表单。 |
表 4种类型的认证
实现认证:
<web-app…>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
表单认证实现:
<web-app…>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/loginPage.html</form-login-page>
<form-error-page>/loginError.html</form-login-page>
</form-login-config>
</login-config>
</web-app>
2.2 授权
servlet规范没有指出容器应该如何实现对认证数据(包括用户名和口令)的支持。现在开发中绝大部分是采用将认证数据存储在数据库中的形式。
授权步骤是:
1)定义角色。
2)定义资源/方法约束。以声明方式指定一个资源/方法组合,只能由特定角色的用户访问。
图 DD中的<security-constraint>元素