我正在接缝中做一个需要安静网址的项目。我有一个映射到/ group / {group} / {locale}的视图。在那个页面上,我有一个所谓的消息列表。每条消息都有一个按钮,用于保存对消息的更改。这与这样的动作bean相关联:
<h:commandButton type="submit" value="Save Changes" action="#{groupAction.update}" />
每封邮件都有一个锚点,因此/ group / {group} / {locale}#{id}可用于使浏览器转到该锚点。这就是我在POST后需要重定向的原因:
<page view-id="/group.xhtml">
<rewrite pattern="/group/{group}/{locale}"/>
<param name="group" value="#{groupAction.group}"/>
<param name="locale" value="#{groupAction.locale}"/>
<navigation from-action="#{groupAction.update}">
<redirect view-id="/group.xhtml?group=#{group}&locale=#{locale}##{id}"/>
</navigation>
</page>
我还有以下重定向规则(UrlRewriteFilter)来获取正确的RESTful URL:
<outbound-rule>
<from>^/group.xhtml\?group=([\.\w]+)&locale=([\.\w]+)\#([\.\w]+)\?cid=(\d*)$</from>
<to type="temporary-redirect" last="true">/group/$1/$2#$3</to>
</outbound-rule>
我在这里删除了对话。这已被测试过一部作品。然而,接缝仍会附加'?conversationId = {cid}'。所以有什么问题?好吧,想象一下像'/ group / {group} / {locale}#{id}?conversationId = {cid}'这样的网址。显然,浏览器不喜欢这个,也不会自动转到那个锚点。
我做了一些研究,并在缝文档中发现了我的问题:
29.1.4.2。带重定向的会话传播 此过滤器允许Seam跨浏览器重定向传播对话上下文。它拦截任何浏览器重定向,并添加一个指定Seam会话标识符的请求参数。重定向过滤器将默认处理所有请求,但也可以在components.xml中调整此行为:
<web:redirect-filter url-pattern="*.seam"/>
我不需要重定向过滤器,我尝试在url-pattern中放置一些无效的东西来“禁用”过滤器。但是那没用。所以现在我的问题是:
如何在接缝中禁用重定向过滤器?
我找不到答案。 seam文档讨论了如何在web.xml中禁用它,但我的尝试还没有成功。
答案 0 :(得分:7)
我已经找到了不需要的conversationId
查询字符串参数的来源。
<redirect/>
会调用org.jboss.seam.faces.FacesManager.redirect(String viewId, Map<String, Object> parameters,
boolean includeConversationId)
通过org.jboss.seam.faces.Navigator
中的以下代码调用此方法,将includeConversationId
设置为true:
FacesManager.instance().redirect(viewId, parameters, true);
我看不出有任何方法可以避免这种情况,因此修复/解决方法是在操作方法中以编程方式执行重定向:
FacesManager.instance().redirect(viewId, parameters, false);
答案 1 :(得分:1)
好的,我设法通过将其添加到我的compononents.xml来杀死重定向过滤器:
<web:redirect-filter disabled="true" installed="false" />
然而,我的主要问题仍然存在,所以这显然不是问题。它仍然将conversationId添加为URL上的额外查询字符串。从it has been done before开始,我正在做错事。
@Adeel Ansari:
的components.xml:
<web:rewrite-filter view-mapping="/seam/*" />
pages.xml看到我最初的问题。