当前位置: 首页 > 知识库问答 >
问题:

Adobe AEM,如何从Apache felix OSGI服务获取SlingHttpServletRequest对象

濮阳鸿祯
2023-03-14

我正在使用AdobeAEM 6.0,对ApacheFelix和Sling还是一个新手,我想知道如何从带有@service注释的OSGI服务获取SlingHttpServletRequest实例。

是否可以从ResourceResolverFactory或SlingRepository获取请求?

@Service
@Component(metatype = false)
public class TestServiceImpl implements  TestService{

    @Reference
    private ResourceResolverFactory resourceResolverFactory;
    @Reference
    private SlingRepository repository;

}

我知道SlingHttpServletRequest可用于扩展SlingAllMethodsServlet的类,但就我的需求而言,我需要编写服务而不是servlet

为什么我需要SlingHttpServletRequest背后的理由是因为我需要获取客户端的IP地址用于审计日志记录目的。

有没有更好的办法?或者至少有人可以帮我指出正确的方向,我如何才能达到这样的要求。

共有1个答案

梁丘波
2023-03-14

我认为过滤器是你需要的。创建一个实现Filter的服务。每个Sling请求都要调用doFilter方法(当然sling.filter.scope=REQUEST)

package com.examples.test.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(
    metatype = true,
    label = "Test Filter",
    immediate = true,
    enabled = true
)
@Service
@Properties({
    @Property(name = "sling.filter.scope", value = "REQUEST", propertyPrivate = true),
    @Property(name = "service.ranking", intValue = 100, propertyPrivate = true)
})
public class TestFilter implements Filter {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //If you'll need some SlingHttpServletRequest functionality
        //SlingHttpServletRequest httpRequest = (SlingHttpServletRequest) request;

        log.info(request.getRemoteAddr());

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

}
 类似资料:
  • 问题内容: 我是Angular的新手(也是Java语言)。我已经编写了一个Angular服务,该服务返回一个用户数组。从HTTP调用检索数据,该HTTP调用以JSON格式返回数据。记录从HTTP调用返回的JSON数据时,可以看到此调用成功,并且返回了正确的数据。我有一个调用服务以获取用户的组件和一个显示用户的HTML页面。我无法从服务到组件获取数据。我怀疑我使用的Observable错误。也许我也

  • 我有一个运行Equinox框架的类。现在我想获取一个对象(在其中一个bundle中定义),该对象由框架外的服务返回。 不幸的是,我得到了一个LinkageError,不知道如何摆脱它。甚至可以让服务向非捆绑代码返回适当的对象吗? 以下是完整的故事: ParserDTOBundle是一个包,它定义了类ParserDTO并导出了相应的包。 在另一个包ParserServiceBundle中,我定义了一

  • 问题内容: 我有以下方法: 在这里,我将ResponseFormat属性设置为json,但仍将其作为XML返回。 我想使用此asmx服务进行json格式化有什么想法吗? 问题答案: 我遇到了同样的问题,并包含以下代码以使其正常工作。 更新: 要获得纯json格式,您可以使用如下的javascript序列化程序。 但是,这适用于复杂类型,但字符串没有任何区别。

  • TDR:我需要在自己的后端拥有Google Cloud Functions。 我编写应用程序,它使用firebase(尤其是firestore)作为在nodejs上编写的我自己的后端和客户端应用程序之间的传输层。 有时,我需要从后端的客户端捕获一些事件,但我希望避免直接向后端执行http查询(因为我需要捕获脱机状态和其他问题)。最好在firestore文档中进行一些更改,在后端捕获这些更改并执行一

  • 我正在尝试访问我在ftps服务器中创建的路径中的一个文件夹,但它没有返回任何东西,它正在连接但没有返回任何东西,如果我将服务器配置更改为ftp,它可以工作。我使用的是FileZilla服务器,其配置如上所示。 SSL/TLS 服务器关于连接的日志收到一条消息,我不知道它是否有用: 227进入被动模式 列表 NLST 需要521个PROT P 退出 知道怎么了吗? 谢谢大家!

  • 我是Javascript新手,我正试图从包含多个对象的数组中获取id键的值。 通过 for..在循环中,我需要对象的id - 如1,2或3 - 与不同的值进行比较。 我试着这样做: 但是,我这样做了,删除Id值返回未定义。 我想不通为什么返回未定义,我无法解决这个问题。 我希望我能很好地表达自己,对不起我的英语不好。