You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tomcat中通过Java类程序化配置security-constraint等Web安全标签?

Servlet 3.x 程序化配置安全约束与登录验证

以下是对应你提供的web.xml配置片段的程序化实现,通过独立Java类完成Servlet 3.x容器的安全配置:

原生Servlet实现方式

创建一个实现ServletContainerInitializer的配置类,容器启动时会自动调用其初始化方法:

import javax.servlet.*;
import java.util.Set;

public class SecurityConfigInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException {
        // 配置Web资源集合(对应<web-resource-collection>)
        WebResourceCollection webResourceCollection = new WebResourceCollection();
        webResourceCollection.setName("Application detail");
        webResourceCollection.addUrlPattern("/*");

        // 配置认证约束(对应<auth-constraint>)
        AuthConstraint authConstraint = new AuthConstraint();
        authConstraint.addRoleName("*");

        // 创建安全约束并关联资源与认证规则(对应<security-constraint>)
        SecurityConstraint securityConstraint = new SecurityConstraint();
        securityConstraint.addWebResourceCollection(webResourceCollection);
        securityConstraint.setAuthConstraint(authConstraint);

        // 将安全约束添加到容器上下文
        servletContext.addSecurityConstraint(securityConstraint);

        // 声明安全角色(对应<security-role>)
        servletContext.declareRoles("*");

        // 配置登录验证方式(对应<login-config>)
        LoginConfig loginConfig = new LoginConfig();
        loginConfig.setAuthMethod("OIDC");
        servletContext.setLoginConfig(loginConfig);
    }
}

容器发现配置类的步骤

需要在项目的META-INF/services目录下创建文件javax.servlet.ServletContainerInitializer,文件内容写入配置类的全限定类名,例如:

com.example.SecurityConfigInitializer

Spring环境适配(可选)

如果你的项目基于Spring MVC或Spring Boot,可实现WebApplicationInitializer接口,无需手动配置服务文件:

import org.springframework.web.WebApplicationInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

public class SpringSecurityConfigInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebResourceCollection webResourceCollection = new WebResourceCollection();
        webResourceCollection.setName("Application detail");
        webResourceCollection.addUrlPattern("/*");

        AuthConstraint authConstraint = new AuthConstraint();
        authConstraint.addRoleName("*");

        SecurityConstraint securityConstraint = new SecurityConstraint();
        securityConstraint.addWebResourceCollection(webResourceCollection);
        securityConstraint.setAuthConstraint(authConstraint);

        servletContext.addSecurityConstraint(securityConstraint);
        servletContext.declareRoles("*");

        LoginConfig loginConfig = new LoginConfig();
        loginConfig.setAuthMethod("OIDC");
        servletContext.setLoginConfig(loginConfig);
    }
}

关键说明

  • *角色表示允许任何已完成认证的用户访问指定资源
  • OIDC认证方法需要你的Servlet容器支持(如Tomcat 9.0.21+、Jetty 11+等)

内容的提问来源于stack exchange,提问作者Domenico Russo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:20:21