如何使用web.xml左右从java应用程序禁用rest端点

sha*_*thi 1 java rest jersey

我有java应用程序(myapp),它说有三个休息端点

  1. 本地主机:8080 /人
  2. 本地主机:8080 /语言
  3. 本地主机:8080 /国家

我的要求是我需要部署3个相同应用程序的实例,比如myapp1,myapp2,myapp3.myapp1应该只允许/个人端点myapp2应该只允许/ languages端点myapp3应该只允许/ countries端点

为了实现这一点,我不希望有太多的java代码更改.是否有可能通过web.xml或springsecurity.xml或类似的东西实现?

我的java应用程序使用的是jersey框架.

以下是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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>ResourcesAPI</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-security.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>PersonDataService</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.local.service.PersonDataApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>PersonDataService</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>request-logging</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)

gal*_*ben 6

如果我理解正确,您将返回com.local.service.PersonDataApplication中的服务类列表.

您可以从运行tomcat的命令行中获取一个参数作为系统属性,并决定在com.local.service.PersonDataApplication :: getClasses方法中返回哪些类.

假设你有一个每个端点的服务类,无论如何都是有意义的......

假设您使用脚本catalina.sh启动tomcat,您可以执行以下操作:

export JAVA_OPTS=-DpersonsEndpoint=true
catalina.sh
Run Code Online (Sandbox Code Playgroud)

在你的getClasses方法中:

if(System.getProperty("personsEndpoint") != null && System.getProperty("personsEndpoint").equals("true")) {
    ... return the person endpoint class
}
Run Code Online (Sandbox Code Playgroud)

编辑:

另外一个选项

我不知道为什么你选择了一个自定义的Application类(它可能对你的用法有意义),但如果你可以删除它,你可以在web.xml中使用jersey.config.server.provider.classnames来定义要扫描哪些类,然后只能在web.xml中进行更改.

在一个配置中:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        com.local.service.PersonService
    </param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

在另一个配置:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        com.local.service.LanguagesService
    </param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

此外,假设这些类是分开的.

com.local.service.PersonService - 所有jaxrs注释方法都与/ persons端点有关的类.