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

时间:2017-02-17 06:43:15

标签: java rest jersey

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

  1. 本地主机:8080 /人
  2. 本地主机:8080 /语言
  3. 本地主机:8080 /国家
  4. 我的要求是我需要部署相同应用程序的3个实例,例如myapp1,myapp2,myapp3。 myapp1应该只允许/个人端点 myapp2应该只允许/ languages端点 myapp3应该只允许/ countries端点

    为了达到这个目的,我不想改变java代码。是否有可能通过web.xml或springsecurity.xml或类似的东西实现?

    我的java应用程序正在使用jersey framework。

    以下是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>
    

1 个答案:

答案 0 :(得分:6)

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

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

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

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

export JAVA_OPTS=-DpersonsEndpoint=true
catalina.sh

在你的getClasses方法中:

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

修改

另一个选择

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

在一个配置中:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        com.local.service.PersonService
    </param-value>
</init-param>

在另一个配置中:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        com.local.service.LanguagesService
    </param-value>
</init-param>

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

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