web.xml配置详解
web.xml配置
根标签
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 其它内容 -->
</web-app>
安全认证标签
元素 | 说明 |
---|---|
web-resource-collection | web-resource-collection元素标识需要限制访问的资源子集。在web-resource-collection元素中,可以定义URL模式和HTTP方法。如果不存在HTTP方法,就将安全约束应用于所有的方法。 |
web-resource-name | 是与受保护资源相关联的名称 |
auth-constraint | auth-constraint元素用于指定可以访问该资源集合的用户角色。如果没有指定auth-constraint元素,就将安全约束应用于所有角色。 |
role-name | 包含安全角色的名称 |
<security-constraint>
<display-name>描述名</display-name>
<web-resource-collection>
<web-resource-name>test</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<!-- 四种认证类型 -->
<!-- BASIC:HTTP规范,Base64 这种方式被认为是最不安全的认证,因为它没有提供强烈的加密措施 -->
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<!-- DIGEST:HTTP规范,数据完整性强一些,但不是SSL 相比于BASIC认证,它是种比较安全的认证,它在认证时将请求数据 通过MD5的加密方式进行认证 -->
<login-config>
<auth-method>DIGEST</auth-method>
</login-config>
<!-- CLIENT-CERT:J2EE规范,数据完整性很强,公共钥匙(PKC) 这是一种基于客户端证书的认证方式,比较安全。但缺陷是在没有安全证书的客户端无法使用 -->
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
<!-- FORM:J2EE规范,数据完整性非常弱,没有加密,允许有定制的登录界面 这是种基础自定义表单的认证,你可以指定登录时的验证表单 -->
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
参数 | 说明 |
---|---|
BASIC | HTTP规范,Base64 这种方式被认为是最不安全的认证,因为它没有提供强烈的加密措施 |
DIGEST | HTTP规范,数据完整性强一些,但不是SSL 相比于BASIC认证,它是种比较安全的认证,它在认证时将请求数据 通过MD5的加密方式进行认证 |
CLIENT-CERT | J2EE规范,数据完整性很强,公共钥匙(PKC) 这是一种基于客户端证书的认证方式,比较安全。但缺陷是在没有安全证书的客户端无法使用 |
FORM | J2EE规范,数据完整性非常弱,没有加密,允许有定制的登录界面 这是种基础自定义表单的认证,你可以指定登录时的验证表单 |
Web 应用图标,名称与描述
<!-- .gif 或者 .jpg格式 -->
<!-- 指出IDE和GUI工具用来表示Web应用的大图标和小图标 -->
<icon>
<!-- (16x16像素) -->
<small-icon>/images/app_small.gif</small-icon>
<!-- (32x32像素) -->
<large-icon>/images/app_large.gif</large-icon>
</icon>
<!-- 指定Web应用程序的显示名称,即GUI工具可以显示的简称 -->
<display-name>Tomcat Example</display-name>
<!-- 给出于此相关的说明性文本 -->
<disciption>Tomcat Example servlets and JSP pages.</disciption>
初始化过程
-
在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<context-param>
-
接着容器会创建一个ServletContext(上下文),整个WEB项目都能使用这个上下文
-
接着容器会将读取到<context-param>转化为键值对,并交给ServletContext
-
容器创建<listener>中的类实例,即创建监听
备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener
-
在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter(“contextConfigName”) 来得到context-param 设定的值
-
在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法,用于关闭应用前释放资源,比如说数据库连接的关闭
得到这个context-param的值之后,你就可以做一些操作了注意,这个时候你的WEB项目还没有完全启动完成,这个动作会比所有的Servlet都要早
-
容器对于web.xml的加载过程是context-param >> listener >> fileter >> servlet
上下文参数context-param
application范围内的参数,存放在servletcontext中
<context-param>
<param-name>contextConfigName</param-name>
<param-value>contextConfigValue></param-value>
</context-param>
作用
-
该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值
使用
- 页面中
${initParam.contextConfigName} - Servlet中
String param = getServletContext().getInitParameter(“contextConfigName”);
过滤器filter
<filter>
<filter-name>OutFilter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>testName</param-name>
<param-value>testValue</param-value>
</init-param>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
<!-- filterConfig.getInitParameter("testName"); -->
</filter>
<filter-mapping>
<filter-name>OutFilter</filter-name>
<url-pattern>/Check.do</url-pattern>
<!--
完全匹配:/index.jsp
目录匹配:/com/*
扩展匹配:*.do
全部匹配:/*
-->
<!-- <dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher> -->
</filter-mapping>
元素 | 说明 |
---|---|
<filter><\filter> | 定一个过滤器 |
<filter-name><\filter-name> | 用于为过滤器指定一个名字,该元素的内容不能为空 |
<filter-class><\filter-class> | 用于指定过滤器的完整的限定类名 |
<init-param><\init-param> | 用于为过滤器指定初始化参数 它的子元素<param-name>指定参数的名字,<param-value>指定参数的值 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数 |
<filter-mapping><\filte-mapping> | 元素用于设置一个 Filter 所负责拦截的资源 |
<filter-name><\filter-name>子元素 | 用于设置filter的注册名称 该值必须是在<filter>元素中声明过的过滤器的名字 |
<url-pattern><\url-pattern>子元素 | 设置 filter 所拦截的请求路径(过滤器关联的URL样式) |
<servlet-name><servlet-name> | 指定过滤器所拦截的Servlet名称 |
<dispatcher>子元素 | 指定过滤器所拦截的资源被 Servlet 容器调用的方式 可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST 用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截 |
-
<dispatcher>子元素可以设置的值及其意义
-
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用
-
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用
只要是通过<jsp:include page=“xxx.jsp” />,嵌入进来的页面,每嵌入的一个页面,都会走一次指定的过滤器
-
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用
只有当当前页面是通过请求转发转发过来的情形时,才会走指定的过滤器
-
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用
监听器listener
<listener>
<listerner-class>com.listener.MyListener</listener-class>
</listener>
servlet
基础配置
<servlet>
<!-- <description>描述</description>
<display-name>描述名</display-name> -->
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.my.controller.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
高级配置
<servlet>
<!-- <description>This is a text description about myservlet</description>
<display-name>myServlet</display-name>
<icon>...</icon> -->
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.my.controller.TestServlet</servlet-class>
<init-param>
<param-name>testName</param-name>
<param-value>testValue</param-value>
</init-param>
<!-- 在servlet的
this.getInitParameter("testName") -->
<load-on-startup>0</load-on-startup>
<run-as>
<description>Security role for anonymous access</description>
<role-name>tomcat</role-name>
</run-as>
<security-role-ref>
<description>...</description>
<role-name>...</role-name>
<role-link>...</role-link>
</security-role-ref>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
元素 | 说明 |
---|---|
<servlet><\servlet> | 用来声明一个servlet的数据 |
<servlet-name><\servlet-name> | 指定servlet的名称 |
<servlet-class><servlet-class> | 指定servlet的类名称 |
<jsp-file></jsp-file> | 指定web站台中的某个JSP网页的完整路径 servlet-class和jsp-file二选一,只能存在一个 |
<init-param><init-param> <param-name></param-name> <param-value></param-value> |
用来定义参数,可有多个init-param servlet范围内的参数,只能在servlet的init()方法中取得 在servlet的init()方法中通过this.getInitParameter(“testName”)获取 |
<load-on-startup></load-on-startup> | load-on-startup 元素标记容器是否应该在启动的时候加载这个servlet,(实例化并调用其init()方法)。 它的值必须是一个整数,表示servlet应该被载入的顺序 指定当Web应用启动时,装载Servlet的次序 当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它 当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet 当值相同时,容器就会自己选择顺序来加载。 |
<run-as><run-as> | 指定用于执行Web应用程序的运行身份。它包含一个可选描述和安全角色的名称 |
<security-role-ref><\security-role-ref> | 用于将<security-role>定义的安全角色名称链接到在servlet逻辑中硬编码的备用角色名称 这种额外的抽象层允许在部署时配置servlet,而无需更改servlet代码 |
<servlet-mapping></servlet-mapping> | 用来定义servlet所对应的URL,包含两个子元素 |
<servlet-name></servlet-name> | 指定servlet的名称 |
<url-pattern></url-pattern> | 指定servlet所对应的URL |
- description,display-name, icon的三个标签必须按照description到display-name再到icon顺序,否则会报错
会话超时配置(单位为分钟)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- 设置值为-1表示会话永不会超时 -->
MIME类型配置
<mime-mapping>
<extension>htm</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
指定欢迎文件页配置
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
配置错误页面
<!-- 通过错误码来配置error-page -->
<error-page>
<error-code>404</error-code>
<location>/jsp/NotFound.jsp</location>
</error-page>
<!-- 通过异常的类型来配置error-page -->
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/jsp/error.jsp</location>
</error-page>
<!-- 当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp -->
jsp-property-group
<jsp-config>
<jsp-property-group>
<!-- 成组导入jsp文件 -->
<url-pattern>*.jsp</url-pattern>
<!-- 设置jsp网页的抬头,扩展名为.jspf -->
<include-prelude>/WEB-INF/jspf/first.jspf</include-prelude>
<!-- 设置jsp网页的结尾,扩展名为.jspf -->
<include-coda>/WEB-INF/jspf/end.jspf</include-coda>
</jsp-property-group>
</jsp-config>
TLD配置
<jsp-config>
<taglib>
<!-- 描述一个相对于web.xml文档位置的URI,用于标识Web应用程序中使用的标记库 -->
<!-- 如果URI与JSP页面上的taglib指令中使用的URI字符串匹配,则使用此taglib -->
<taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri>
<!-- 相对于Web应用程序根目录的标记库描述符的文件位置 -->
<taglib-location>/WEB-INF/pager-taglib.tld</taglib-location>
</taglib>
</jsp-config>
获取配置文件中的参数
- servlet
import javax.servlet.ServletConfig;
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 利用ServletConfig的getInitParameter来获取参数
String testName = config.getInitParameter("testName");
}
- struts
try {
javax.servlet.ServletConfig config = this.getServlet().getServletConfig();
System.out.println("--" + config.getInitParameter("testName"));
} catch (Exception e) {
e.printStackTrace();
}
- jsp
String testName = new String(application.getInitParameter("testName"));