Toggle navigation
Toggle navigation
This project
Loading...
Sign in
ufo
/
yohoufo-fore
·
Commits
Go to a project
GitLab
Go to group
Project
Activity
Files
Commits
Pipelines
0
Builds
0
Graphs
Milestones
Issues
0
Merge Requests
0
Members
Labels
Wiki
Forks
Network
Create a new issue
Download as
Email Patches
Plain Diff
Browse Files
Authored by
Lixiaodi
7 years ago
Commit
4920c45e3d5345fac477b75f2d50cb91e0a9661d
1 parent
7ba87e5b
删除无用的bean
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
218 additions
and
49 deletions
common/src/main/java/com/yohoufo/common/filter/ResponseChecksumFilter.java
common/src/main/java/com/yohoufo/common/interceptor/RemoteIPInterceptor.java
common/src/main/resources/META-INF/spring/spring-gateway-context.xml
product/src/main/java/com/yohoufo/product/controller/ProductController.java
web/src/main/resources/META-INF/spring/spring-web-context.xml
web/src/main/webapp/WEB-INF/web.xml
common/src/main/java/com/yohoufo/common/filter/ResponseChecksumFilter.java
0 → 100644
View file @
4920c45
package
com
.
yohoufo
.
common
.
filter
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.nio.charset.Charset
;
import
javax.servlet.FilterChain
;
import
javax.servlet.ServletException
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
com.netflix.config.DynamicPropertyFactory
;
import
org.apache.commons.io.IOUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.util.Assert
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.web.filter.OncePerRequestFilter
;
import
org.springframework.web.util.ContentCachingResponseWrapper
;
import
org.springframework.web.util.WebUtils
;
/**
* 对响应的body添加MD5
*/
public
class
ResponseChecksumFilter
extends
OncePerRequestFilter
{
private
static
final
String
HEADER_CHECKSUM
=
"X-YH-Response-Checksum"
;
private
static
final
String
HEADER_CLOUD
=
"X-YH-Response-Cloud"
;
private
static
final
String
MD5_SALT
=
"fd4ad5fcsa0de589af23234ks1923ks"
;
@Override
protected
boolean
shouldNotFilter
(
HttpServletRequest
request
)
throws
ServletException
{
/**** 不处理下面的情况 **/
String
path
=
request
.
getRequestURI
();
if
(
path
.
contains
(
"hystrix.stream"
)){
return
true
;
}
return
false
;
}
/**
* The default value is "false" so that the filter may delay the generation of
* an ETag until the last asynchronously dispatched thread.
*/
@Override
protected
boolean
shouldNotFilterAsyncDispatch
()
{
return
false
;
}
@Override
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
filterChain
)
throws
ServletException
,
IOException
{
HttpServletResponse
responseToUse
=
response
;
//先不考虑异步的情况
if
(!(
response
instanceof
ContentCachingResponseWrapper
))
{
responseToUse
=
new
ContentCachingResponseWrapper
(
response
);
}
filterChain
.
doFilter
(
request
,
responseToUse
);
//update response if needed
updateResponse
(
responseToUse
);
}
private
void
updateResponse
(
HttpServletResponse
response
)
throws
IOException
{
ContentCachingResponseWrapper
responseWrapper
=
WebUtils
.
getNativeResponse
(
response
,
ContentCachingResponseWrapper
.
class
);
Assert
.
notNull
(
responseWrapper
,
"ContentCachingResponseWrapper not found"
);
HttpServletResponse
rawResponse
=
(
HttpServletResponse
)
responseWrapper
.
getResponse
();
int
statusCode
=
responseWrapper
.
getStatusCode
();
if
(
rawResponse
.
isCommitted
())
{
responseWrapper
.
copyBodyToResponse
();
}
else
if
(
isNeedAddMD5
(
statusCode
))
{
String
md5
=
this
.
generateMD5
(
responseWrapper
.
getContentInputStream
());
rawResponse
.
setHeader
(
HEADER_CHECKSUM
,
md5
);
// 响应中返回来自哪个云
String
cloud
=
DynamicPropertyFactory
.
getInstance
().
getStringProperty
(
"cloud"
,
null
).
get
();
rawResponse
.
setHeader
(
HEADER_CLOUD
,
cloud
);
responseWrapper
.
copyBodyToResponse
();
}
else
{
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"Response with status code ["
+
statusCode
+
"] not eligible for md5"
);
}
responseWrapper
.
copyBodyToResponse
();
}
}
/**
* 是否需要添加MD5 正常的响应才需要
*/
protected
boolean
isNeedAddMD5
(
int
responseStatusCode
)
{
if
(
responseStatusCode
>=
200
&&
responseStatusCode
<
300
)
{
return
true
;
}
return
false
;
}
/**
* 生成MD5: md5(salt:md5(body))
*
* @param inputStream
* @return
* @throws IOException
*/
protected
String
generateMD5
(
InputStream
inputStream
)
throws
IOException
{
// md5(body)
StringBuilder
builder
=
new
StringBuilder
(
32
);
DigestUtils
.
appendMd5DigestAsHex
(
inputStream
,
builder
);
//md5(salt:md5(body))
StringBuilder
md5
=
new
StringBuilder
(
32
);
String
now
=
MD5_SALT
+
":"
+
builder
.
toString
();
InputStream
bodyStream
=
new
ByteArrayInputStream
(
now
.
getBytes
(
Charset
.
forName
(
"UTF-8"
)));
DigestUtils
.
appendMd5DigestAsHex
(
bodyStream
,
md5
);
IOUtils
.
closeQuietly
(
bodyStream
);
return
md5
.
toString
();
}
}
\ No newline at end of file
...
...
common/src/main/java/com/yohoufo/common/interceptor/RemoteIPInterceptor.java
0 → 100644
View file @
4920c45
package
com
.
yohoufo
.
common
.
interceptor
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
/**
* 获取客户端IP保存在thread local中。 调用方法:{@link RemoteIPInterceptor#getRemoteIP()}
* Created by chzhang@yoho.cn on 2015/11/5.
*/
public
class
RemoteIPInterceptor
implements
HandlerInterceptor
{
private
static
final
ThreadLocal
<
String
>
localIp
=
new
ThreadLocal
<>();
@Override
public
boolean
preHandle
(
HttpServletRequest
httpServletRequest
,
HttpServletResponse
httpServletResponse
,
Object
o
)
throws
Exception
{
String
ip
=
httpServletRequest
.
getHeader
(
"X-Real-IP"
);
if
(
StringUtils
.
isEmpty
(
ip
))
{
ip
=
httpServletRequest
.
getRemoteAddr
();
}
localIp
.
set
(
ip
);
return
true
;
}
/**
* 获取客户端IP地址
* @return 客户端请求IP地址
*/
public
static
String
getRemoteIP
(){
return
localIp
.
get
();
}
@Override
public
void
postHandle
(
HttpServletRequest
httpServletRequest
,
HttpServletResponse
httpServletResponse
,
Object
o
,
ModelAndView
modelAndView
)
throws
Exception
{
}
@Override
public
void
afterCompletion
(
HttpServletRequest
httpServletRequest
,
HttpServletResponse
httpServletResponse
,
Object
o
,
Exception
e
)
throws
Exception
{
localIp
.
remove
();
}
}
...
...
common/src/main/resources/META-INF/spring/spring-gateway-context.xml
View file @
4920c45
...
...
@@ -43,17 +43,10 @@
<property
name=
"isDebugEnable"
value=
"${is_debug_enable:false}"
/>
<property
name=
"checkMethods"
ref=
"validateMethodMap"
/>
</bean>
<bean
id=
"httpRequestInterceptor"
class=
"com.yoho.gateway.common.interceptor.HttpRequestInterceptor"
/>
<bean
id=
"localIpInterceptor"
class=
"com.yoho.gateway.common.interceptor.RemoteIPInterceptor"
/>
<bean
id=
"accessStatistics"
class=
"com.yoho.gateway.common.interceptor.AccessStatistics"
/>
<bean
id=
"productBrowserStatistic"
class=
"com.yoho.gateway.user.controller.browse.ProductBrowserStatistic"
/>
<bean
id=
"accessLogInterceptor"
class=
"com.yoho.gateway.common.interceptor.AccessLogInterceptor"
/>
<bean
id=
"innerApiInterceptor"
class=
"com.yoho.gateway.common.interceptor.InnerApiInterceptor"
>
<property
name=
"enableDebug"
value=
"${is_debug_enable:false}"
/>
</bean>
<bean
id=
"localIpInterceptor"
class=
"com.yohoufo.common.interceptor.RemoteIPInterceptor"
/>
<!-- end -->
<bean
id=
"redisGwCacheClient"
class=
"com.yoho
.gateway
.common.cache.RedisGwCacheClient"
>
<bean
id=
"redisGwCacheClient"
class=
"com.yoho
ufo
.common.cache.RedisGwCacheClient"
>
</bean>
<bean
id=
"consultConfigMap"
class=
"org.springframework.beans.factory.config.YamlMapFactoryBean"
>
<property
name=
"resources"
>
...
...
product/src/main/java/com/yohoufo/product/controller/ProductController.java
0 → 100644
View file @
4920c45
package
com
.
yohoufo
.
product
.
controller
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
com.yohoufo.common.ApiResponse
;
import
com.yohoufo.common.annotation.IgnoreSession
;
import
com.yohoufo.common.annotation.IgnoreSignature
;
@Controller
public
class
ProductController
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ProductController
.
class
);
@IgnoreSignature
@IgnoreSession
@RequestMapping
(
params
=
"method=app.product.data"
)
@ResponseBody
public
ApiResponse
queryProductDetailBySKN
(
@RequestParam
(
value
=
"product_skn"
,
required
=
false
)
String
productskn
,
@RequestParam
(
value
=
"product_id"
,
required
=
false
)
String
productId
,
@RequestParam
(
value
=
"current_vip_level"
,
required
=
false
,
defaultValue
=
"0"
)
Integer
currentVipLevel
,
@RequestParam
(
value
=
"image_url"
,
required
=
false
)
String
imageUrl
)
{
if
(
null
==
productskn
&&
null
==
productId
)
{
return
new
ApiResponse
(
404
,
"product_skn or product_id Is Null"
,
null
);
}
logger
.
info
(
"queryProductDetailBySKN method=app.product.data productskn is:{},productId is:{}"
,
productskn
,
productId
);
return
new
ApiResponse
.
ApiResponseBuilder
().
data
(
null
).
code
(
200
).
message
(
"product info"
).
build
();
}
}
\ No newline at end of file
...
...
web/src/main/resources/META-INF/spring/spring-web-context.xml
View file @
4920c45
...
...
@@ -27,30 +27,6 @@
</mvc:message-converters>
</mvc:annotation-driven>
<!--<bean id="bigDataRedisTemplate"-->
<!--class="org.springframework.data.redis.core.RedisTemplate" primary="true"-->
<!--p:connectionFactory-ref="bigDataJedisConnectionFactory"-->
<!--p:keySerializer-ref="stringRedisSerializer"-->
<!--p:valueSerializer-ref="stringRedisSerializer"/>-->
<!--<bean id="bigDataJedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"-->
<!--p:timeout="150"-->
<!--p:poolConfig-ref="jedisPoolConfig"-->
<!--p:hostName="${bigDataRedis.proxy.address}"-->
<!--p:port="${bigDataRedis.proxy.port}"-->
<!--p:password="${bigDataRedis.proxy.auth}"-->
<!--p:database="${bigDataRedis.proxy.database:0}" primary="true" />-->
<!--<!– pool config –>-->
<!--<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">-->
<!--<property name="maxTotal" value="100" />-->
<!--<property name="maxIdle" value="100" />-->
<!--<property name="minIdle" value="50" />-->
<!--<property name="maxWaitMillis" value="${bigDataRedis.pool.maxWaitMillis:2000}" />-->
<!--<property name="testOnBorrow" value="${bigDataRedis.pool.testOnBorrow:false}" />-->
<!--<property name="testWhileIdle" value="${bigDataRedis.pool.testWhileIdle:false}" />-->
<!--</bean>-->
<bean
id=
"stringRedisSerializer"
class=
"org.springframework.data.redis.serializer.StringRedisSerializer"
/>
...
...
@@ -96,22 +72,12 @@
<task:executor
id=
"myExecutor"
pool-size=
"5"
/>
<task:scheduler
id=
"myScheduler"
pool-size=
"10"
/>
<util:map
id=
"stroSysMap"
key-type=
"java.lang.String"
value-type=
"com.yoho.gateway.common.service.StroSystemService"
>
<entry
key=
"QINIU"
value-ref=
"qNSystemServiceImpl"
></entry>
</util:map>
<util:list
id=
"stroSysList"
>
<ref
bean=
"qNSystemServiceImpl"
/>
</util:list>
<bean
id=
"handlebarsViewResolver"
class=
"com.github.jknack.handlebars.springmvc.HandlebarsViewResolver"
>
<property
name=
"prefix"
value=
"classpath:/conf/template"
/>
<property
name=
"suffix"
value=
".html"
/>
<property
name=
"contentType"
value=
"text/html;charset=UTF-8"
/>
</bean>
<bean
id=
"abtestAspect"
class=
"com.yoho.gateway.common.abtest.aspect.ABTestAspect"
/>
<!-- api文档配置 start -->
<!-- api文档配置 注解扫描器 -->
<bean
id=
"yohoApiAnnotationScanner"
class=
"com.yoho.tools.docs.YohoApiAnnotationScanner"
>
...
...
@@ -124,16 +90,11 @@
<!--Spring mvc 拦截器-->
<mvc:interceptors>
<ref
bean=
"accessLogInterceptor"
/>
<ref
bean=
"trace.traceInterceptor"
/>
<ref
bean=
"threadProfileInterceptor"
/>
<ref
bean=
"localIpInterceptor"
/>
<ref
bean=
"securityInterceptor"
/>
<ref
bean=
"signatureVerifyInterceptor"
/>
<ref
bean=
"accessStatistics"
/>
<ref
bean=
"productBrowserStatistic"
/>
<ref
bean=
"httpRequestInterceptor"
/>
<ref
bean=
"innerApiInterceptor"
/>
</mvc:interceptors>
</beans>
\ No newline at end of file
...
...
web/src/main/webapp/WEB-INF/web.xml
View file @
4920c45
...
...
@@ -58,7 +58,7 @@
<filter>
<filter-name>
responseChecksumFilter
</filter-name>
<filter-class>
com.yoho
.gateway
.common.filter.ResponseChecksumFilter
</filter-class>
<filter-class>
com.yoho
ufo
.common.filter.ResponseChecksumFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>
responseChecksumFilter
</filter-name>
...
...
Please
register
or
login
to post a comment