JavaEE 7教程

Servlet的Web Fragments和安全性

上页

  Web Fragments碎片

  一个web片段是web.xml文件的部分或全部,被包含的库或框架的JAR的 META-INF目录。如果这个框架捆绑在当前项目的WEB-INF/lib目录中, 容器将发现找到并配置框架,而无需开发人员
额外再做任何事情。 它可以包括几乎所有可以在web.xml中指定的元素。配置文件必须是web-fragment.xml. xml.这个名称。

 

<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.xml中的资源加载的顺序。在web.xml中<absolute-ordering>元素 用于指定在其中应加载的资源的确切顺序,在web-fragment.xml.xml的<order>也是用于指定相对排序。两个命令是互斥的,而绝对顺序覆盖相对顺序。 绝对顺序包含一个或多个<NAME>元素指定的名称、要加载的资源和顺序。指定<others/>
规定在顺序中没有命名的其他资源加载。

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

在web.xml中指定的资源被加载顺序依次是MyServlet和MyFilter。

<before> 和 <after> 可以用在 <ordering>中,指定时间先后:

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

指定在MyServlet后面加载资源MyFilter。

如果web.xml 设置 metadata-complete 为true,web-fragment.xml不被处理。

安全性

  Servlet通常通过互联网访问,因此具有安全性要求,使用注释或在web.xml中可以指定servlet的安全模型,包括角色,访问控制 和认证要求。 @ 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用于指定该doGet方法可以是属于R2角色的用户访问,doPost方法调用可以由用户是R3和R4角色时被调用。@ HttpConstraint指定所有其他方法可以被
属于角色R1的用户调用。

也可以在web.xml中定义:

<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>

这个部署描述符要求只有在/account/*的URL GET方法 被保护。此方法只能由一个要求内容完整的manager角色的用户访问,所有其他的GET HTTP方法是不受保护。不指定GET等方法,就是指所有方法。

出现在Servlet3.1的新元素<deny-uncovered-http-methods>元素,可以用于拒绝对未覆盖的HTTP方法请求拒绝, 请求返回一个403(SC_FORBIDDEN)状态码:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<deny-uncovered-http-methods/>
<web-resource-collection>
<url-pattern>/account/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
. . .
</web-app>

该<deny-uncovered-http-methods>元素确保HTTP GET是 调用所需的安全认证,和所有其他的HTTP方法被拒绝返回 一个403状态码。

@RolesAllowed, @DenyAll, @PermitAll, 和 @TransportProtected提供基于代码方法的安全控制访问:

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

Serlvet 3.1提供了两个预定义角色:

  1. *映射到任何已定义的角色。
  2. **映射到任何身份验证的用户独立的作用。

@ RolesAllowed,@ DenyAll或@ PermitAll中只能有一个在目标指定。而@TransportProtected注释可能出现的组合是@RolesAllowed 或@ PermitAll注解。

Servlet能被配置成HTTP Basic, HTTP Digest, HTTPS Client, 和 formbased authentication等方式。

<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password" autocomplete="off">
<input type="button" value="submit">
</form>

这段代码显示了如何基于表单的身份验证实现。登录表单必须 包含用于输入用户名和密码字段。这些字段必须命名为 为j_username和j_password。表单的Action总是j_security_check。


Servlet的3.1需要在密码表单字段自动完成设置“关闭”,进一步加强 基于servlet的形式的安全性。
HttpServletRequest的还提供了编程安全与登录,日志 出,并验证方法。
一个校验realm用来验证用户名和密码,配置在ServletContext中。这可确保该容器中的请求的getUserPrincipal,getRemoteUser和getAuthType方法返回一个 有效值。

login方法可以作为一个替代基于表单的登录。为容器配置的登录验证机制将验证这个发出要求登入请求的用户。

下页

基于容器的用户安全认证授权系统

Spring security安全机制深入使用

JavaEE教程

Java学习心得