Authored by Lixiaodi

删除无用的bean

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
... ...
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();
}
}
... ...
... ... @@ -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.yohoufo.common.cache.RedisGwCacheClient">
</bean>
<bean id="consultConfigMap" class="org.springframework.beans.factory.config.YamlMapFactoryBean">
<property name="resources">
... ...
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
... ...
... ... @@ -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" />-->
<!--&lt;!&ndash; pool config &ndash;&gt;-->
<!--<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
... ...
... ... @@ -58,7 +58,7 @@
<filter>
<filter-name>responseChecksumFilter</filter-name>
<filter-class>com.yoho.gateway.common.filter.ResponseChecksumFilter</filter-class>
<filter-class>com.yohoufo.common.filter.ResponseChecksumFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>responseChecksumFilter</filter-name>
... ...