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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:52:35