Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
schbrain-parent
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
framework
schbrain-parent
Commits
f249c534
Commit
f249c534
authored
Aug 22, 2023
by
liaozan
🏀
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor request wrapper
parent
e8e69aab
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
176 additions
and
89 deletions
+176
-89
commons/web-common/src/main/java/com/schbrain/common/web/ServletComponentConfiguration.java
...om/schbrain/common/web/ServletComponentConfiguration.java
+7
-7
commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java
.../common/web/argument/BodyParamMethodArgumentResolver.java
+5
-5
commons/web-common/src/main/java/com/schbrain/common/web/servlet/ContentCachingRequest.java
...om/schbrain/common/web/servlet/ContentCachingRequest.java
+50
-0
commons/web-common/src/main/java/com/schbrain/common/web/servlet/RequestLoggingFilter.java
...com/schbrain/common/web/servlet/RequestLoggingFilter.java
+4
-4
commons/web-common/src/main/java/com/schbrain/common/web/servlet/RequestWrapperFilter.java
...com/schbrain/common/web/servlet/RequestWrapperFilter.java
+2
-2
commons/web-common/src/main/java/com/schbrain/common/web/servlet/WrappedByteArrayInputStream.java
...brain/common/web/servlet/WrappedByteArrayInputStream.java
+62
-0
commons/web-common/src/main/java/com/schbrain/common/web/support/signature/AbstractSignatureValidationInterceptor.java
...ort/signature/AbstractSignatureValidationInterceptor.java
+2
-2
commons/web-common/src/main/java/com/schbrain/common/web/utils/ContentCachingServletUtils.java
...schbrain/common/web/utils/ContentCachingServletUtils.java
+0
-69
commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java
...schbrain/common/web/utils/RequestContentCachingUtils.java
+44
-0
No files found.
commons/web-common/src/main/java/com/schbrain/common/web/ServletComponentConfiguration.java
View file @
f249c534
...
...
@@ -33,22 +33,22 @@ public class ServletComponentConfiguration {
@Bean
@ConditionalOnMissingBean
public
RequestWrapperFilter
defaukltRequestWrapperFilter
()
{
return
new
RequestWrapperFilter
();
public
RequestContextFilter
requestContextFilter
()
{
OrderedRequestContextFilter
requestContextFilter
=
new
OrderedRequestContextFilter
();
requestContextFilter
.
setThreadContextInheritable
(
true
);
return
requestContextFilter
;
}
@Bean
@ConditionalOnMissingBean
public
RequestContextFilter
defaultRequestContextFilter
()
{
OrderedRequestContextFilter
requestContextFilter
=
new
OrderedRequestContextFilter
();
requestContextFilter
.
setThreadContextInheritable
(
true
);
return
requestContextFilter
;
public
RequestWrapperFilter
requestWrapperFilter
()
{
return
new
RequestWrapperFilter
();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty
(
value
=
"schbrain.web.enable-request-logging"
,
havingValue
=
"true"
,
matchIfMissing
=
true
)
public
RequestLoggingFilter
defaultR
equestLoggingFilter
()
{
public
RequestLoggingFilter
r
equestLoggingFilter
()
{
return
new
RequestLoggingFilter
();
}
...
...
commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java
View file @
f249c534
...
...
@@ -5,18 +5,18 @@ import com.fasterxml.jackson.databind.JsonNode;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.schbrain.common.util.JacksonUtils
;
import
com.schbrain.common.web.annotation.BodyParam
;
import
com.schbrain.common.web.servlet.ContentCachingRequest
;
import
lombok.Setter
;
import
org.springframework.core.MethodParameter
;
import
org.springframework.util.Assert
;
import
org.springframework.web.context.request.NativeWebRequest
;
import
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver
;
import
org.springframework.web.util.ContentCachingRequestWrapper
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.IOException
;
import
java.lang.reflect.Type
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
ContentCachingServletUtils
.
wrapRequest
IfRequired
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
RequestContentCachingUtils
.
wrap
IfRequired
;
import
static
org
.
springframework
.
web
.
context
.
request
.
RequestAttributes
.
SCOPE_REQUEST
;
/**
...
...
@@ -68,15 +68,15 @@ public class BodyParamMethodArgumentResolver extends AbstractNamedValueMethodArg
private
JsonNode
getRequestBody
(
NativeWebRequest
nativeWebRequest
)
throws
IOException
{
JsonNode
requestBody
=
(
JsonNode
)
nativeWebRequest
.
getAttribute
(
REQUEST_BODY_CACHE
,
SCOPE_REQUEST
);
if
(
requestBody
==
null
)
{
ContentCachingRequest
Wrapper
request
=
wrapRequest
(
nativeWebRequest
);
ContentCachingRequest
request
=
wrapRequest
(
nativeWebRequest
);
requestBody
=
objectMapper
.
readTree
(
request
.
getInputStream
());
nativeWebRequest
.
setAttribute
(
REQUEST_BODY_CACHE
,
requestBody
,
SCOPE_REQUEST
);
}
return
requestBody
;
}
private
ContentCachingRequest
Wrapper
wrapRequest
(
NativeWebRequest
nativeWebR
equest
)
{
return
wrap
RequestIfRequired
(
nativeWebR
equest
.
getNativeRequest
(
HttpServletRequest
.
class
));
private
ContentCachingRequest
wrapRequest
(
NativeWebRequest
r
equest
)
{
return
wrap
IfRequired
(
r
equest
.
getNativeRequest
(
HttpServletRequest
.
class
));
}
}
commons/web-common/src/main/java/com/schbrain/common/web/servlet/ContentCachingRequest.java
0 → 100644
View file @
f249c534
package
com.schbrain.common.web.servlet
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.StreamUtils
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequestWrapper
;
import
java.io.IOException
;
/**
* @author liaozan
* @since 2023/8/22
*/
@Slf4j
public
class
ContentCachingRequest
extends
HttpServletRequestWrapper
{
private
WrappedByteArrayInputStream
inputStream
;
public
ContentCachingRequest
(
HttpServletRequest
request
)
{
super
(
request
);
}
@Override
public
WrappedByteArrayInputStream
getInputStream
()
throws
IOException
{
if
(
inputStream
==
null
)
{
byte
[]
bytes
=
StreamUtils
.
copyToByteArray
(
super
.
getInputStream
());
this
.
inputStream
=
new
WrappedByteArrayInputStream
(
bytes
);
}
return
inputStream
;
}
/**
* Return the cached request content as a String. The Charset used to decode the cached content is the same as returned by getCharacterEncoding.
*/
public
String
getContentAsString
()
{
return
getContentAsString
(
getCharacterEncoding
());
}
/**
* Return the cached request content as a String
*/
public
String
getContentAsString
(
String
charset
)
{
try
{
return
getInputStream
().
getContentAsString
(
charset
);
}
catch
(
IOException
e
)
{
throw
new
IllegalStateException
(
e
.
getMessage
(),
e
);
}
}
}
commons/web-common/src/main/java/com/schbrain/common/web/servlet/RequestLoggingFilter.java
View file @
f249c534
...
...
@@ -14,8 +14,8 @@ import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
ContentCachingServlet
Utils
.
getRequestBody
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
ContentCachingServletUtils
.
wrapRequest
IfRequired
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
RequestContentCaching
Utils
.
getRequestBody
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
RequestContentCachingUtils
.
wrap
IfRequired
;
/**
* 请求日志拦截器
...
...
@@ -35,7 +35,7 @@ public class RequestLoggingFilter extends OncePerRequestFilter implements Ordere
return
;
}
request
=
wrap
Request
IfRequired
(
request
);
request
=
wrapIfRequired
(
request
);
long
startTime
=
System
.
currentTimeMillis
();
try
{
...
...
@@ -55,7 +55,7 @@ public class RequestLoggingFilter extends OncePerRequestFilter implements Ordere
String
method
=
request
.
getMethod
();
String
requestUri
=
request
.
getRequestURI
();
String
queryString
=
request
.
getQueryString
();
String
requestBody
=
getRequestBody
(
request
,
false
);
String
requestBody
=
getRequestBody
(
request
);
StringBuilder
builder
=
new
StringBuilder
();
builder
.
append
(
"requestUri: "
).
append
(
method
).
append
(
CharPool
.
SPACE
).
append
(
requestUri
);
if
(
StringUtils
.
isNotBlank
(
queryString
))
{
...
...
commons/web-common/src/main/java/com/schbrain/common/web/servlet/RequestWrapperFilter.java
View file @
f249c534
...
...
@@ -10,7 +10,7 @@ import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
ContentCachingServletUtils
.
wrapRequest
IfRequired
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
RequestContentCachingUtils
.
wrap
IfRequired
;
/**
* @author liaozan
...
...
@@ -25,7 +25,7 @@ public class RequestWrapperFilter extends OncePerRequestFilter implements Ordere
@Override
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
chain
)
throws
ServletException
,
IOException
{
chain
.
doFilter
(
wrap
Request
IfRequired
(
request
),
response
);
chain
.
doFilter
(
wrapIfRequired
(
request
),
response
);
}
}
commons/web-common/src/main/java/com/schbrain/common/web/servlet/WrappedByteArrayInputStream.java
0 → 100644
View file @
f249c534
package
com.schbrain.common.web.servlet
;
import
javax.servlet.ReadListener
;
import
javax.servlet.ServletInputStream
;
import
java.io.ByteArrayInputStream
;
import
java.nio.charset.Charset
;
/**
* @author liaozan
* @since 2023/8/22
*/
public
class
WrappedByteArrayInputStream
extends
ServletInputStream
{
private
final
ByteArrayInputStreamWrapper
delegate
;
public
WrappedByteArrayInputStream
(
byte
[]
bytes
)
{
this
.
delegate
=
new
ByteArrayInputStreamWrapper
(
bytes
);
}
@Override
public
boolean
isFinished
()
{
return
delegate
.
available
()
==
0
;
}
@Override
public
boolean
isReady
()
{
return
true
;
}
@Override
public
void
setReadListener
(
ReadListener
ignore
)
{
}
@Override
public
int
read
()
{
return
delegate
.
read
();
}
/**
* Return the cached request content as a String
*/
public
String
getContentAsString
(
String
charset
)
{
return
new
String
(
delegate
.
getBytes
(),
Charset
.
forName
(
charset
));
}
/**
* Simple {@link ByteArrayInputStream} wrapper that exposes the underlying byte array.
*/
private
static
class
ByteArrayInputStreamWrapper
extends
ByteArrayInputStream
{
public
ByteArrayInputStreamWrapper
(
byte
[]
bytes
)
{
super
(
bytes
);
}
public
byte
[]
getBytes
()
{
return
buf
;
}
}
}
commons/web-common/src/main/java/com/schbrain/common/web/support/signature/AbstractSignatureValidationInterceptor.java
View file @
f249c534
...
...
@@ -14,7 +14,7 @@ import java.util.List;
import
java.util.Objects
;
import
static
cn
.
hutool
.
core
.
text
.
StrPool
.
UNDERLINE
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
ContentCachingServlet
Utils
.
getRequestBody
;
import
static
com
.
schbrain
.
common
.
web
.
utils
.
RequestContentCaching
Utils
.
getRequestBody
;
import
static
org
.
springframework
.
web
.
util
.
WebUtils
.
getNativeRequest
;
public
abstract
class
AbstractSignatureValidationInterceptor
<
T
extends
SignatureContext
>
extends
BaseHandlerInterceptor
{
...
...
@@ -51,7 +51,7 @@ public abstract class AbstractSignatureValidationInterceptor<T extends Signature
String
requestUri
=
wrappedRequest
.
getRequestURI
();
String
queryString
=
wrappedRequest
.
getQueryString
();
String
requestBody
=
getRequestBody
(
wrappedRequest
,
true
);
String
requestBody
=
getRequestBody
(
wrappedRequest
);
// 校验签名
String
calculatedSignature
=
signParams
(
requestUri
,
queryString
,
requestBody
,
timestamp
,
appKey
,
context
.
getAppSecret
());
...
...
commons/web-common/src/main/java/com/schbrain/common/web/utils/ContentCachingServletUtils.java
deleted
100644 → 0
View file @
e8e69aab
package
com.schbrain.common.web.utils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.Assert
;
import
org.springframework.util.StreamUtils
;
import
org.springframework.web.util.ContentCachingRequestWrapper
;
import
org.springframework.web.util.ContentCachingResponseWrapper
;
import
javax.annotation.Nullable
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.nio.charset.Charset
;
import
static
org
.
springframework
.
web
.
util
.
WebUtils
.
getNativeRequest
;
/**
* @author liaozan
* @since 2023-05-08
*/
@Slf4j
public
class
ContentCachingServletUtils
{
/**
* Make request content cacheable to avoid stream closed error after inputStream closed
*/
public
static
ContentCachingRequestWrapper
wrapRequestIfRequired
(
HttpServletRequest
request
)
{
Assert
.
notNull
(
request
,
"request must not be null"
);
if
(
request
instanceof
ContentCachingRequestWrapper
)
{
return
(
ContentCachingRequestWrapper
)
request
;
}
else
{
return
new
ContentCachingRequestWrapper
(
request
);
}
}
/**
* Make response content cacheable to avoid stream closed error after outputStream closed
*/
public
static
ContentCachingResponseWrapper
wrapResponseIfRequired
(
HttpServletResponse
response
)
{
Assert
.
notNull
(
response
,
"response must not be null"
);
if
(
response
instanceof
ContentCachingResponseWrapper
)
{
return
(
ContentCachingResponseWrapper
)
response
;
}
else
{
return
new
ContentCachingResponseWrapper
(
response
);
}
}
/**
* Get request body content
*/
@Nullable
public
static
String
getRequestBody
(
HttpServletRequest
request
,
boolean
readFromInputStream
)
{
ContentCachingRequestWrapper
nativeRequest
=
getNativeRequest
(
request
,
ContentCachingRequestWrapper
.
class
);
if
(
nativeRequest
==
null
)
{
return
null
;
}
Charset
charset
=
Charset
.
forName
(
nativeRequest
.
getCharacterEncoding
());
if
(
readFromInputStream
)
{
try
{
return
StreamUtils
.
copyToString
(
request
.
getInputStream
(),
charset
);
}
catch
(
IOException
e
)
{
log
.
warn
(
"Failed to read body content from request inputStream"
,
e
);
return
null
;
}
}
return
new
String
(
nativeRequest
.
getContentAsByteArray
(),
charset
);
}
}
commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java
0 → 100644
View file @
f249c534
package
com.schbrain.common.web.utils
;
import
com.schbrain.common.web.servlet.ContentCachingRequest
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.Assert
;
import
javax.annotation.Nullable
;
import
javax.servlet.http.HttpServletRequest
;
import
static
org
.
springframework
.
web
.
util
.
WebUtils
.
getNativeRequest
;
/**
* @author liaozan
* @since 2023-05-08
*/
@Slf4j
public
class
RequestContentCachingUtils
{
/**
* Make request content cacheable to avoid stream closed error after inputStream closed
*/
public
static
ContentCachingRequest
wrapIfRequired
(
HttpServletRequest
request
)
{
Assert
.
notNull
(
request
,
"request must not be null"
);
if
(
request
instanceof
ContentCachingRequest
)
{
return
(
ContentCachingRequest
)
request
;
}
else
{
return
new
ContentCachingRequest
(
request
);
}
}
/**
* Get request body content
*/
@Nullable
public
static
String
getRequestBody
(
HttpServletRequest
request
)
{
ContentCachingRequest
requestToUse
=
getNativeRequest
(
request
,
ContentCachingRequest
.
class
);
if
(
requestToUse
==
null
)
{
log
.
warn
(
"request is not an instance of {}"
,
ContentCachingRequest
.
class
.
getSimpleName
());
return
null
;
}
return
requestToUse
.
getContentAsString
();
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment