如何从SFCC(Demandware)获取最后访问及最后渲染的Pipeline名称?
嘿,在SFCC(Demandware)里搞定这两个需求其实挺直接的,主要靠内置的请求对象和会话上下文,我给你一步步说清楚:
获取最后访问的Pipeline
这里的“最后访问”指的是当前请求的上一个请求对应的Pipeline,我们可以通过请求头里的Referer字段来获取,然后解析出其中的Pipeline名称:
- 首先通过
request对象拿到上一个请求的完整URL:String refererUrl = request.getHttpServletRequest().getHeader("Referer"); - 接着解析这个URL,提取
PipelineName参数的值。推荐用SFCC内置的URLUtils工具类来简化操作:String lastVisitedPipeline = null; if (refererUrl != null) { com.demandware.servlet.util.URLUtils urlObj = com.demandware.servlet.util.URLUtils.parse(refererUrl); lastVisitedPipeline = urlObj.getParameter("PipelineName"); }
注意:
Referer字段可能为空(比如用户直接在地址栏输入URL访问当前页面),所以一定要做非空判断,避免空指针异常。
获取最后渲染的Pipeline名称
这个需求分两种场景,对应不同的实现方式:
场景1:获取当前请求中最后渲染的Pipeline
如果是在当前请求的上下文里(比如Pipeline的处理器、自定义标签中),直接调用request对象的内置方法就能拿到:
String currentRenderedPipeline = request.getPipelineName();
这个方法返回的就是当前正在执行/最后渲染的Pipeline名称,哪怕你在Pipeline里用了forward跳转,它也会返回最终跳转后的Pipeline名称。
场景2:获取跨请求的最后渲染的Pipeline
如果需要记录用户最近一次渲染的Pipeline(跨多个请求),可以把Pipeline名称存在用户会话里,比如通过自定义过滤器来实现:
- 先写一个自定义过滤器,在请求处理前记录当前Pipeline到会话:
public class LastPipelineTrackerFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String currentPipeline = httpRequest.getParameter("PipelineName"); if (currentPipeline != null && !currentPipeline.isEmpty()) { httpRequest.getSession().setAttribute("lastRenderedPipeline", currentPipeline); } chain.doFilter(request, response); } // 其他Filter接口的方法(init、destroy)可以留空或者按需实现 }
- 在需要的地方(比如另一个Pipeline的处理器中)从会话取出:
String lastRenderedPipeline = (String) request.getHttpServletRequest().getSession().getAttribute("lastRenderedPipeline");
注意:会话会在用户长时间无操作后过期,所以如果需要持久化记录,可能还要结合数据库存储,但大部分场景下会话存储足够用了。
内容的提问来源于stack exchange,提问作者Aravind
相关产品推荐
相关产品推荐

