这是上一个问题的后续解答:Error using JSF protected views when opening a new tab
我正在使用受faces-config保护的视图来防御CSRF。较早时,我遇到了问题,我在新标签页中打开了链接,并通过添加
解决了该问题rel="noopener noreferrer"
所有新标签页链接。
但是现在我遇到了与commandButtons相同的问题。
我有
<p:commandButton value="Submit"
action="#{bean.submit}" />
然后commit()返回带有新视图的字符串。但是我仍然收到以下错误:
javax.faces.application.ProtectedViewException: JSF1099: Referer [sic] header value http://.../updatestatus.xhtml?javax.faces.Token=1534516398157&cr=45309 does not appear to be a protected view. Preventing display of viewId /finance/commitmentregister/view.xhtml
at com.sun.faces.lifecycle.RestoreViewPhase.maybeTakeProtectedViewAction(Unknown Source)
有没有办法在Primefaces命令按钮上不设置引用或打开工具?
编辑:
也许不是我要找的答案,但是我通过在过滤器中添加servlet请求包装器来解决该问题,当请求引荐来源时返回null。
进一步编辑:
使用包装程序修复程序添加我的代码的大致轮廓:
@WebFilter(filterName = "UserLoginFilter", urlPatterns = { "*.xhtml" })
public class UserLoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(httpServletRequest) {
@Override
public String getHeader(String name) {
if (name.equalsIgnoreCase("referer")) {
return null;
} else {
return super.getHeader(name);
}
}
};
chain.doFilter(wrapper, response);
}
}