@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2012 the original author or authors .
* Copyright 2002 - 2018 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -19,8 +19,12 @@ import java.io.IOException;
@@ -19,8 +19,12 @@ import java.io.IOException;
import java.util.List ;
import javax.servlet.FilterChain ;
import javax.servlet.RequestDispatcher ;
import javax.servlet.ServletException ;
import javax.servlet.ServletRequest ;
import javax.servlet.ServletResponse ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletRequestWrapper ;
import javax.servlet.http.HttpServletResponse ;
import org.springframework.security.web.util.OnCommittedResponseWrapper ;
@ -33,6 +37,7 @@ import org.springframework.web.filter.OncePerRequestFilter;
@@ -33,6 +37,7 @@ import org.springframework.web.filter.OncePerRequestFilter;
* and X - Content - Type - Options .
*
* @author Marten Deinum
* @author Josh Cummings
* @since 3 . 2
*
* /
@ -62,8 +67,11 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
@@ -62,8 +67,11 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
HeaderWriterResponse headerWriterResponse = new HeaderWriterResponse ( request ,
response , this . headerWriters ) ;
HeaderWriterRequest headerWriterRequest = new HeaderWriterRequest ( request ,
headerWriterResponse ) ;
try {
filterChain . doFilter ( request , headerWriterResponse ) ;
filterChain . doFilter ( heade rWriterR equest, headerWriterResponse ) ;
}
finally {
headerWriterResponse . writeHeaders ( ) ;
@ -106,4 +114,39 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
@@ -106,4 +114,39 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
return ( HttpServletResponse ) getResponse ( ) ;
}
}
static class HeaderWriterRequest extends HttpServletRequestWrapper {
private final HeaderWriterResponse response ;
HeaderWriterRequest ( HttpServletRequest request , HeaderWriterResponse response ) {
super ( request ) ;
this . response = response ;
}
@Override
public RequestDispatcher getRequestDispatcher ( String path ) {
return new HeaderWriterRequestDispatcher ( super . getRequestDispatcher ( path ) , this . response ) ;
}
}
static class HeaderWriterRequestDispatcher implements RequestDispatcher {
private final RequestDispatcher delegate ;
private final HeaderWriterResponse response ;
HeaderWriterRequestDispatcher ( RequestDispatcher delegate , HeaderWriterResponse response ) {
this . delegate = delegate ;
this . response = response ;
}
@Override
public void forward ( ServletRequest request , ServletResponse response ) throws ServletException , IOException {
this . delegate . forward ( request , response ) ;
}
@Override
public void include ( ServletRequest request , ServletResponse response ) throws ServletException , IOException {
this . response . onResponseCommitted ( ) ;
this . delegate . include ( request , response ) ;
}
}
}