【问题标题】:Not able to set X-Frame option in servlet response from Spring controller无法在 Spring 控制器的 servlet 响应中设置 X-Frame 选项
【发布时间】:2017-02-22 04:15:15
【问题描述】:

我正在尝试在嵌入标签中打开 PDF。 pdf 是从 servlet 呈现的:

            response.setContentType("application/pdf"); 
            response.setHeader("Content-Disposition", "inline; filename=\"" + pab.getPdfName() + "\"");
            response.setHeader("X-Frame-Options", "ALLOW");
            response.setContentLength((int) pdfFile.length());
            fileInputStream = new FileInputStream(pdfFile);
            responseOutputStream = response.getOutputStream();
            int bytes;
            while ((bytes = fileInputStream.read()) != -1) {
                responseOutputStream.write(bytes);
            }

但是,即使将 x-frame-option 设置为允许,如上所示,我仍然收到错误:

具有冲突值的多个“X-Frame-Options”标头('ALLOW, DENY') 加载时遇到 'http://localhost:8082/b2bNext/viewPdf'。回退到“拒绝”。

我正在使用 spring 4.X 任何人都可以建议我如何克服它并显示 pdf。提前谢谢。

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    已通过在上下文安全文件中添加框架选项来修复。

      <http auto-config="true"  use-expressions="true">
                <intercept-url pattern="/rateWebService" access="hasRole('ROLE_ADMIN')" />
                <intercept-url pattern="/**" access="permitAll" />
                <form-login login-page="/loginA2B" login-processing-url="/j_spring_security_check"  default-target-url="/rateWebService" authentication-failure-url="/loginA2B?valid=false" />
                <logout logout-url="/j_spring_security_logout" logout-success-url="/logout"  />
                <csrf disabled="true"/>
        <headers>
                <frame-options policy="SAMEORIGIN"/>
        </headers>
      </http>
    

    【讨论】:

      【解决方案2】:

      这似乎是 spring-security 的一个错误。 https://github.com/spring-projects/spring-security/issues/5193

      解决方法:

      JavaConfig:https://github.com/spring-projects/spring-security/issues/2953#issue-131777949

      XmlConfig:https://github.com/spring-projects/spring-security/issues/2953#issuecomment-335443527

      使用Content-Security-Policy 代替X-Frame-Options:可以使用response.setHeader("Content-Security-Policy", "frame-ancestors 'self'"); 代替X-Frame-Options

      【讨论】:

        【解决方案3】:

        您也可以在 WebSecurityConfigurerAdapter 实现中的 Java 代码中执行此操作:

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                [... your stuff ...]
                .and().headers().frameOptions().sameOrigin();
        }
        

        【讨论】:

          【解决方案4】:

          为我的响应设置这些标题对我有用。

          response.setHeader("X-Frame-Options", "SAMEORIGIN");
          response.setHeader("Content-Security-Policy", " frame-ancestors 'self'");
          

          参考:https://infosec.mozilla.org/guidelines/web_security#x-frame-options

          【讨论】:

            猜你喜欢
            • 2019-04-09
            • 2020-12-24
            • 2017-07-29
            • 2020-09-20
            • 1970-01-01
            • 2013-12-24
            • 2018-08-18
            • 2012-04-07
            • 1970-01-01
            相关资源
            最近更新 更多