JSF inputFile Отказ от отображения «mypage.x html» во фрейме, поскольку для «X-Frame-Options» установлено значение «deny». - PullRequest
1 голос
/ 06 февраля 2020

Я следил за этим ответом Балуса C, чтобы попытаться загрузить файл на сервер. Я использую его код как есть.

При использовании 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)

Я видел этот ответ , который предполагал, что это ошибка в JSF 2.2. Поэтому я загрузил в 2.3.

С JSF 2.3 достигается #{bean.save}, и файл успешно сохраняется. Но ошибка js остается, и я не могу загрузить второй файл.

Есть идеи?


РЕДАКТИРОВАТЬ , если это поможет: я не Не знаю почему, но после выбора файла для загрузки в диалоговом окне на мою страницу каким-то образом добавляется <iframe>.


РЕДАКТИРОВАТЬ 2

Балус C и Селарон предложили мне попытаться изменить заголовок 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 со значением «что угодно», чтобы проверить, содержал ли ответ этот заголовок при переходе в браузер.

Оказывается, 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, потому что do c для HttpSecurity.addFilter говорит, что это последний фильтр в цепочке.

Я немного растерялся сейчас. Моя пара вопросов:

  1. Правильно ли я предполагаю, что заголовок X-Frame-Options перезаписывается каким-либо другим фильтром?

  2. Как Могу ли я убедиться, что оставленные мной параметры X-Frame остаются? Или, как я могу поставить свой фильтр в конце цепи?

1 Ответ

3 голосов
/ 06 февраля 2020

Я обнаружил эту проблему, когда команда Mojarra планировала Реализовать загрузку файла "ajax" # 2577 , а зафиксировать фактическую реализацию его в jsf javascript. К сожалению, документация по выпуску 2577 больше не доступна, и поэтому она не объясняет, почему здесь нужен iframe.

Первый отрывок этого блога дает краткое объяснение, почему AJAX загрузка файла была / была (?) Невозможна напрямую:

Ajax Загрузка файла стиля с использованием Hidden iFrame от Viral Patel · 18 ноября 2008 г.

Загрузка файла с использованием AJAX невозможно. AJAX на самом деле не отправляет формы на сервер, он отправляет выбранные данные на сервер в виде запроса POST или GET. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * - * - * - * -, - * - 1026 *. Вы должны прибегнуть к обычной старой форме подачи. Если вы где-то читали / видели это, то это не через AJAX. В этом случае загрузка файла происходит через iframe. Вы должны использовать iframe для загрузки файлов. Таким образом, вы можете использовать iframe для асинхронной загрузки (например, AJAX, но не AJAX).

Итак, наконец, вы можете либо - как прокомментировал Balus C - расслабить свой X-Frame-Options настройка заголовка или изменить загрузку, чтобы не использовать AJAX:

<h:form enctype="multipart/form-data">
    <h:inputFile value="#{bean.file}" />
    <h:commandButton value="upload" action="#{bean.save}"/>
</h:form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...