Adobe AEM 6.5 Cloud中如何在SlingServletPaths使用通配符?
解决AEM 6.5中代理/api/所有路径的Servlet实现问题
要处理/api/下的所有可变路径,无需依赖已失效的自定义ResourceResolver方案,直接利用Sling Servlet的路径匹配机制即可解决,以下是两种可行方案:
方案一:通配符路径匹配(适配所有/api开头路径)
这是AEM 6.5中推荐的Servlet注册方式,通过@Component的属性配置通配符路径,能匹配所有/api/开头的请求,包括多级嵌套路径:
import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.HttpConstants; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.osgi.service.component.annotations.Component; import javax.servlet.Servlet; import javax.servlet.ServletException; import java.io.IOException; @Component( service = Servlet.class, property = { "sling.servlet.paths=/api/*", "sling.servlet.methods=" + HttpConstants.METHOD_GET, "sling.servlet.methods=" + HttpConstants.METHOD_POST, "sling.servlet.methods=" + HttpConstants.METHOD_PUT, "sling.servlet.methods=" + HttpConstants.METHOD_DELETE } ) public class ApiProxyServlet extends SlingSafeMethodsServlet { @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { handleProxy(request, response); } @Override protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { handleProxy(request, response); } @Override protected void doPut(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { handleProxy(request, response); } @Override protected void doDelete(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { handleProxy(request, response); } private void handleProxy(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { // 获取完整的请求路径(例如/api/player/1234/transactions) String fullApiPath = request.getRequestPathInfo().getResourcePath(); // 此处编写实际代理逻辑: // 1. 构造目标服务的请求URL // 2. 转发请求头、参数、请求体 // 3. 将目标服务的响应回写给客户端 response.setContentType("application/json"); response.getWriter().write("{\"proxyTargetPath\": \"" + fullApiPath + "\"}"); } }
关键说明:
sling.servlet.paths=/api/*会匹配所有以/api/开头的路径,包括任意层级的嵌套路径- 根据业务需求添加需要支持的HTTP方法,避免开放不必要的方法
- 通过
request.getRequestPathInfo().getResourcePath()可获取完整请求路径,用于后续代理转发
方案二:正则路径匹配(适配特定格式的/api路径)
如果需要仅匹配符合特定规则的/api/路径(比如/api/player/{数字}/transactions),可以使用sling.servlet.paths.regex属性配置正则匹配:
@Component( service = Servlet.class, property = { "sling.servlet.paths.regex=/api/player/[0-9]+/transactions", "sling.servlet.methods=" + HttpConstants.METHOD_GET } )
这种方式适合需要精细控制路径匹配规则的场景,正则语法遵循Java标准正则规范。
注意事项
- 避免同时注册多个匹配
/api/*的Servlet,否则会引发请求路由冲突 - 代理逻辑中要注意处理请求头、请求体的编码问题,确保转发和响应的格式正确性
- 可结合Sling的
RequestDispatcher或第三方HTTP客户端(如Apache HttpClient)实现实际的请求转发
内容的提问来源于stack exchange,提问作者John Little
相关产品推荐
相关产品推荐

