JSF inputFile被拒绝在框架中显示'mypage.xhtml',因为它将'X-Frame-Options'设置为'deny'

问题描述 投票:1回答:1

我正在按照this answer by BalusC尝试将文件上传到服务器。我按原样使用他的代码。

使用JSF 2.2时,从未到达#{bean.save},并且从未保存过文件。

服务器的控制台什么也没显示。但是js控制台显示了此错误:

Refused to display 'http://localhost:8080/my_app/hello.xhtml' in a frame because it set 'X-Frame-Options' to 'deny'.
jsf.js.xhtml?ln=javax.faces:1 Uncaught DOMException: Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame.
    at FrameTransport.callback (http://localhost:8080/my_app/javax.faces.resource/jsf.js.xhtml?ln=javax.faces:1:5109)
    at HTMLIFrameElement.<anonymous> (http://localhost:8080/my_app/javax.faces.resource/jsf.js.xhtml?ln=javax.faces:1:5759)

[我看到this answer表示这是JSF 2.2中的错误。所以我上传到2.3。

使用JSF 2.3,已到达#{bean.save},并且文件已成功保存。但是js错误仍然存​​在,并且我无法上传第二个文件。

有什么想法吗?


[EDIT,以防万一:我不知道为什么,但是在对话框中选择要上传的文件后,以某种方式将<iframe>添加到了我的页面。


编辑2

BalusC和Selaron建议我尝试将X-Frame-Options标头更改为非'DENY'。我尝试添加@WebFilter并在其中设置标题,如下所示:

public void doFilter(...) 
{ 
    HttpServletResponse response = (HttpServletResponse) res; 
    response.addHeader("X-Frame-Options", "sameorigin"); 
    response.setHeader("MyHeader", "whatever"); 
    chain.doFilter(req, res); 
}

我添加了第二个标头MyHeader,其值是“ whatever”,以检查到达浏览器时响应是否包含该标头。

结果是MyHeader正确进入浏览器,但X-Frame-Options仍然保留为'DENY'。


当我使用Spring Security时,我发现也许还有其他过滤器使我的响应混乱了?

所以,我有这个:

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        ...
        http.addFilterAfter(
            new CustomFilter(), SwitchUserFilter.class);    
        ...
    }
}

[我的CustomFilter与我之前显示的一样:MyHeader保留,但X-Frame-Options没有。

我在SwitchUserFilter之后添加了它,因为HttpSecurity.addFilter的文档说这是链中的最后一个过滤器。

我现在有点迷茫。我的几个问题:

  1. 我是否正确假设X-Frame-Options标头被其他过滤器覆盖?

  2. 我如何确保保留设置的X框架选项?或者,如何将过滤器放在链的末尾?

jsf jsf-2.2
1个回答
3
投票
[C0的第一段简要说明了为什么不能直接进行AJAX文件上传吗?]

使用隐藏的iFrame上传Ajax样式文件发表者:Viral Patel·2008年11月18日

无法使用AJAX上传文件。 AJAX实际上没有发布表单发送到服务器,它将选定的数据以表单的形式发送到服务器POST或GET请求。由于javascript无法抓取用户计算机中的文件并将其发送到服务器,这只是AJAX无法实现。您必须诉诸常规旧表格提交。如果您在某处读过/看过它,则不是通过AJAX。文件在这种情况下,上传是通过iframe进行的。您必须使用iframe上传文件。因此,您可以使用iframe进行异步上传(就像AJAX一样,但不是AJAX)。

所以最后,您的选择是-如BalusC所评论-放松this blog标头设置,或将您的上载更改为不使用AJAX:

X-Frame-Options

© www.soinside.com 2019 - 2024. All rights reserved.