|
1 | 1 | /* |
2 | | - * Copyright 2002-2012 the original author or authors. |
| 2 | + * Copyright 2002-2018 the original author or authors. |
3 | 3 | * |
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | 5 | * you may not use this file except in compliance with the License. |
|
19 | 19 | import java.util.List; |
20 | 20 |
|
21 | 21 | import javax.servlet.FilterChain; |
| 22 | +import javax.servlet.RequestDispatcher; |
22 | 23 | import javax.servlet.ServletException; |
| 24 | +import javax.servlet.ServletRequest; |
| 25 | +import javax.servlet.ServletResponse; |
23 | 26 | import javax.servlet.http.HttpServletRequest; |
| 27 | +import javax.servlet.http.HttpServletRequestWrapper; |
24 | 28 | import javax.servlet.http.HttpServletResponse; |
25 | 29 |
|
26 | 30 | import org.springframework.security.web.util.OnCommittedResponseWrapper; |
|
33 | 37 | * and X-Content-Type-Options. |
34 | 38 | * |
35 | 39 | * @author Marten Deinum |
| 40 | + * @author Josh Cummings |
36 | 41 | * @since 3.2 |
37 | 42 | * |
38 | 43 | */ |
@@ -62,8 +67,11 @@ protected void doFilterInternal(HttpServletRequest request, |
62 | 67 |
|
63 | 68 | HeaderWriterResponse headerWriterResponse = new HeaderWriterResponse(request, |
64 | 69 | response, this.headerWriters); |
| 70 | + HeaderWriterRequest headerWriterRequest = new HeaderWriterRequest(request, |
| 71 | + headerWriterResponse); |
| 72 | + |
65 | 73 | try { |
66 | | - filterChain.doFilter(request, headerWriterResponse); |
| 74 | + filterChain.doFilter(headerWriterRequest, headerWriterResponse); |
67 | 75 | } |
68 | 76 | finally { |
69 | 77 | headerWriterResponse.writeHeaders(); |
@@ -106,4 +114,39 @@ private HttpServletResponse getHttpResponse() { |
106 | 114 | return (HttpServletResponse) getResponse(); |
107 | 115 | } |
108 | 116 | } |
| 117 | + |
| 118 | + static class HeaderWriterRequest extends HttpServletRequestWrapper { |
| 119 | + private final HeaderWriterResponse response; |
| 120 | + |
| 121 | + HeaderWriterRequest(HttpServletRequest request, HeaderWriterResponse response) { |
| 122 | + super(request); |
| 123 | + this.response = response; |
| 124 | + } |
| 125 | + |
| 126 | + @Override |
| 127 | + public RequestDispatcher getRequestDispatcher(String path) { |
| 128 | + return new HeaderWriterRequestDispatcher(super.getRequestDispatcher(path), this.response); |
| 129 | + } |
| 130 | + } |
| 131 | + |
| 132 | + static class HeaderWriterRequestDispatcher implements RequestDispatcher { |
| 133 | + private final RequestDispatcher delegate; |
| 134 | + private final HeaderWriterResponse response; |
| 135 | + |
| 136 | + HeaderWriterRequestDispatcher(RequestDispatcher delegate, HeaderWriterResponse response) { |
| 137 | + this.delegate = delegate; |
| 138 | + this.response = response; |
| 139 | + } |
| 140 | + |
| 141 | + @Override |
| 142 | + public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException { |
| 143 | + this.delegate.forward(request, response); |
| 144 | + } |
| 145 | + |
| 146 | + @Override |
| 147 | + public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException { |
| 148 | + this.response.onResponseCommitted(); |
| 149 | + this.delegate.include(request, response); |
| 150 | + } |
| 151 | + } |
109 | 152 | } |
0 commit comments