gpt4 book ai didi

java - 如何删除静态资源的 Orchestra 转换上下文参数?

转载 作者:行者123 更新时间:2023-12-04 05:43:51 24 4
gpt4 key购买 nike

为了提供适当的浏览器缓存,我想摆脱 conversationContext参数,Apache MyFaces Orchestra 添加到每个请求,用于请求 css 文件。

Bozho建议,我已经实现了一个过滤器来设置 Orchestra 正在寻找的属性。

public class ResourceFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse theResponse, FilterChain theChain) throws IOException, ServletException {
if(shouldNotAppendConversation(request)) {
request.setAttribute(RequestParameterServletFilter.REQUEST_PARAM_FILTER_CALLED, Boolean.TRUE);
}

theChain.doFilter(request, theResponse);
}

private boolean shouldNotAppendConversation(ServletRequest theRequest) {
HttpServletRequest aRequest = (HttpServletRequest) theRequest;
String aPath = aRequest.getRequestURI();
if(aPath.endsWith(".css.jsf")) {
return true;
}

return false;
}

@Override
public void init(FilterConfig theFilterConfig) throws ServletException {
}

@Override
public void destroy() {
}
}

这不起作用,参数仍然附加到每个请求。在调试时,我发现过滤器首先被对 jsf 站点的请求命中。当然我想包括 conversation context在该请求中,因此过滤器将请求直接转发到链中的下一个过滤器。下一个命中过滤器的请求(通常是对 css 文件的请求)已经是 conversation context包含在请求中。

奇怪的是,如果我将过滤器修改为 总是 设置属性,所有请求都不会有 conversation context属性。但这意味着, conversation context也不包含在对 jsf 站点的请求中(但应该)。

我注意到jsf站点生成的html中css文件的链接也包含 conversation context属性与否取决于过滤器的实现。我猜出于这个原因,第二个请求已经包含了 conversation context范围?

我不明白为什么 Orchestra 会附加 conversation context每个请求的参数,而不仅仅是未设置属性的请求。

如何实现过滤器才能正常工作?

最佳答案

在对您页面的请求之后,下一个请求(例如 CSS 文件)命中您的过滤器已经是 conversationContext包含参数只是因为这是该资源的 url 在上一个请求中被页面呈现的方式。

所以控制了conversationContext应在渲染时拍摄。以下解决方案适用于 JSF 2(我使用的是 Mojarra 2.1.11、myfaces-orchestra-core20 1.5、RichFaces 4.1.0.Final)。一个特殊的 servlet 过滤器除了包装之外什么都不做 HttpServletResponse使用我们自己的包装器:

public class RfOrchestraParamControlFilter implements Filter {
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
response = new RfOrchestraParamControlResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, response);
}
...
}

响应包装器测试要为 being a richfaces resource 编码的 url交响乐团的 ConversationRequestParameterProvider编码时在当前线程中开启的分离模式:
package ...
import javax.faces.application.ResourceHandler;
import org.richfaces.resource.ResourceHandlerImpl;
import org.apache.myfaces.orchestra.conversation.ConversationRequestParameterProvider;

public class RfOrchestraParamControlResponseWrapper extends HttpServletResponseWrapper {

public RfOrchestraParamControlResponseWrapper(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
}

@Override
public String encodeURL(String url) {
if (url.contains(ResourceHandler.RESOURCE_IDENTIFIER) || url.contains(ResourceHandlerImpl.RICHFACES_RESOURCE_IDENTIFIER)) {
boolean current = ConversationRequestParameterProvider.isInSeparationMode();
/* Disable conversationContext parameter in current thread for the time of rendering link to a resource */
ConversationRequestParameterProvider.setInSeparationMode(true);

String result = super.encodeURL(url);

/* Restore */
ConversationRequestParameterProvider.setInSeparationMode(current);
return result;
}
else return super.encodeURL(url);
}

}

(我不得不使用 String.contains() 而不是 String.startsWith() 在测试作为资源的 url 时,因为上下文路径和 servlet 路径恰好在传递的 url 之前。)

然而,这也无济于事。原因是 Orchestra 使用它自己的响应包装,它发生在它的 RequestParameterFacesContextFactory 中。 ,这种包装发生在我们的过滤器被命中之后。通过这种方式, Orchestra 的包装器在我们的包装器之外,导致我们的包装器接收 url为时已晚,当 url 已经被截获而 conversationContext附加。

为了避免这种情况,我们有一种方法可以通过替换来自 RequestParameterFacesContextFactory 的 effect 来使我们的响应包装器位于 Orchestra 的外部。拦截器 RequestParameterServletFilter实际上 does the same work .不幸的是,在我们可能不会的地方使用另一个过滤器并不是很精致,但到目前为止我还没有看到另一种方式。

所以,在 web.xml将您的过滤器放在 Orchestra 的过滤器之后:
<filter>
<filter-name>requestParameterFilter</filter-name>
<filter-class>org.apache.myfaces.orchestra.requestParameterProvider.RequestParameterServletFilter</filter-class>
</filter>
<filter>
<filter-name>myOrchestraFilter</filter-name>
<filter-class>mypkg.RfOrchestraParamControlFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>requestParameterFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>myOrchestraFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

关于java - 如何删除静态资源的 Orchestra 转换上下文参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10931702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com