日期:2014-05-19  浏览次数:20717 次

『译』Java EE 6 Pocket.Guide— Servlets3.0(三)

Web Fragments

?

  一个web fragment是包含在一个库或框架JAR的META-INF目录中的web.xml的一部分或全部,如果这个框架绑定在WEB-INF/lib目录中,容器将选择和配置的框架,而不需要开发人员明确的做什么。几乎所有的元素,可以在web.xml中指定,然而,顶层元素必须是web-fragment,相应的文件必须被称为web-fragment.xml,这使得Web应用程序的配置逻辑分开:

<web-fragment>
  <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>org.example.MyFilter</filter-class>
    <init-param>
      <param-name>myInitParam</param-name>
      <param-value>...</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-fragment>
?

  在web.xml和web-fragment.xml中开发人员可以指定需要加载资源的顺序。web.xml文件中的<absolute-ordering>元素用于指定应该被加载的资源的确切顺序,web-fragment.xml内的<ordering>元素用于指定相对顺序。这两个命令是互斥的,绝对顺序覆盖相对顺序。绝对排序的<name>元素包含一个或多个需要被加载的指定名称和资源的顺序,<others/>允许为其他资源按未指定的顺序加载:

?

<web-app>
  <name>MyApp</name>
  <absolute-ordering>
    <name>MyServlet</name>
    <name>MyFilter</name>
  </absolute-ordering>
</web-app>

  在这段代码中,加载在web.xml中指定的资源,然后是MyServlet和MyFilter。

?

  <ordering>元素可以用零个或一个<before>和<after>元素,分别指定web-fragment被加载之前或加载之后需要的资源:

?

<web-fragment>
  <name>MyFilter</name>
  <ordering>
    <after>MyServlet</after>
  </ordering>
</web-fragment>

  这段代码将需要在容器的的资源MyServlet(在其他地方定义)被加载后,加载资源MyFilter。

?

  如果web.xml中metadata-complete设置为true,那么webfragment.xml不被处理,web.xml中具有最高优先级,这解决了web.xml和web-fragment.xml之间冲突。如果一个的web-fragment.xml没有一个<ordering>元素或者web.xml不具有<absolute-ordering>元素,资源被假设为没有任何顺序依赖性。

?

Security

?

  Servlet通常是通过互联网访问,因此具有安全性要求。servlet的安全模型,包括角色、访问控制和认证需求,可以使用注解或在web.xml中指定。@ServletSecurity用于指定servlet实现类的所有方法或特定的doXXX方法安全约束。容器执行相应的doXXX信息可以被特定的角色用户所调用:

?

@WebServlet("/account")
@ServletSecurity(value=@HttpConstraint(rolesAllowed = {"R1"}),httpMethodConstraints={@HttpMethodConstraint(value="GET",rolesAllowed="R2"),@HttpMethodConstraint(value="POST",
rolesAllowed={"R3", "R4"})})
public class AccountServlet extends javax.servlet.http.HttpServlet {
  //. . .
}

? ?  在这段代码中,@HttpMethodConstraint用于指定R2可以调用doGet()方法,R3和R4角色可以调用doPost()方法。@HttpConstraint指定R1可以调用所有的方法,角色映射容器中的安全主体或团体。

?

  安全限制,也可以使用在web.xml中指定的<security-constraint>元素;<webresource-collection>用于指定HTTP操作和网络资源的限制,<auth-constraint>用于指定允许访问该资源的角色,<user-data-constraint>的子元素<transportguarantee>表示数据如何在客户端和服务器之间应受到保护:

?

<security-constraint>
  <web-resource-collection>
    <url-pattern>/account/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>manager</role-name>
  </auth-constraint>
  <user-data-constraint>
    <transport-guarantee>INTEGRITY</transport-guarantee>
  </user-data-constraint>
</security-constraint>

  此部署描述符明确doGet()方法只能由经理角色用户访问。

?

  @ RolesAllowed、@ DenyAll、PermitAll和@Transport注释,来指定提供另一套保护机制,限制访问一个特定的资源或资源方法:

?

@RolesAllowed("R2")
protected void doGet(HttpServletRequest request,HttpServletResponse response) {
  //. . .
}

??  如果一个注解在类和方法级别上都指定,方法指定将覆盖类中指定。在大多数的情况下,一个@RolesAllowed、@DenyAll、@PermitAll可以指定一个目标,@TransportProtected注解中可能出现任意组合的@RolesAllowed或@PermitAll注解。

?

  servlets可配置HTTP基本信息、HTTP摘要、HTTPS客户端以及基于表单的身份验证:

?

<form method="POST" act