我有java应用程序(myapp),它说有三个休息端点
我的要求是我需要部署相同应用程序的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>
答案 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端点有关的类。