2017-02-21 16 views
1

私はスプリングブートアプリケーションでレストAPIを開発しました。 APIはGETとPOSTのみを受け付けますが、OPTIONSメソッドを使用してリクエストすると、APIは200のステータスに応答します(405ではなく)。私はこの問題を探検しましたが、解決策のどれもspringbootに基づいていませんでした。スプリングブートアプリケーションでHTTPオプションを無効にする

応答:

Allow: OPTIONS, TRACE, GET, HEAD, POST 
Public: OPTIONS, TRACE, GET, HEAD, POST 

はOPTIONSメソッドを無効にする必要があります。

+0

@durサーバーの部分は無視してください。実際には、完全な応答を分類して表示することはできません。そこで、同様のタイプのレスポンスを追加しました。あなたが理解することを願って –

答えて

1

Previous answerは鉱山専用ですので、鉱山も追加してください。標準のサーブレットフィルタを使用して、例えば、方法、クロスコンテナを無効にすることができ:

import java.io.IOException; 
import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component;  
import org.springframework.web.filter.OncePerRequestFilter; 

@Component 
public class MethodFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
        throws ServletException, IOException { 
     if (request.getMethod().equals("OPTIONS")) { 
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); 
     } else { 
      filterChain.doFilter(request, response); 
     } 
    } 
} 

注意:このクラスは、ばねによってcomponentscannedされているものとします。そうでない場合は、in hereのような他の登録方法を使用することができます。

0

これを試してみました。

@Bean 
public EmbeddedServletContainerCustomizer containerCustomizer() { 
    return new EmbeddedServletContainerCustomizer() { 
     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      if (container.getClass().isAssignableFrom(TomcatEmbeddedServletContainerFactory.class)) { 
       TomcatEmbeddedServletContainerFactory tomcatContainer = (TomcatEmbeddedServletContainerFactory) container; 
       tomcatContainer.addContextCustomizers(new ContextSecurityCustomizer()); 
      } 
     } 
    }; 
} 

private static class ContextSecurityCustomizer implements TomcatContextCustomizer { 
    @Override 
    public void customize(Context context) { 
     SecurityConstraint constraint = new SecurityConstraint(); 
     SecurityCollection securityCollection = new SecurityCollection(); 
     securityCollection.setName("restricted_methods"); 
     securityCollection.addPattern("/*"); 
     securityCollection.addMethod(HttpMethod.OPTIONS.toString()); 
     constraint.addCollection(securityCollection); 
     constraint.setAuthConstraint(true); 
     context.addConstraint(constraint); 
    } 
} 
関連する問題