packagecom.wanda.crs.filter;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.lang.StringUtils;importorg.slf4j.Logger;importcom.alibaba.fastjson.JSON;importcom.wanda.crs.standard.model.ClientInfoModel;importcom.wanda.crs.utils.Contants;importcom.wanda.crs.utils.HttpClientUtils;importcom.wanda.crs.utils.MyRequestUtil;importcom.wanda.crs.utils.PropConfigUtil;importcom.wanda.crs.utils.RenderHelper;importcom.wanda.crs.utils.SignCheck;importcom.wanda.crs.utils.StandardResult;importcom.wanda.crs.utils.StringUtil;importcom.wanda.crs.utils.httpclient.HttpRequest;public class HttpRequestSignInputCheck implementsFilter{private Logger _log =org.slf4j.LoggerFactory.getLogger(getClass());private static final String requestClientAppId = "clientId";/*** 是否是开发模式*/
private static final boolean devMode = true;private String excludedPages; //不需要拦截的url
privateString[] excludedPagesArray;private static String api_url="";
@Overridepublic voiddestroy() {
System.gc();
}
@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throwsIOException, ServletException {
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;boolean isExcludedPage = false;if(excludedPagesArray!=null&&excludedPagesArray.length>0){for (String page : excludedPagesArray) { //不需要拦截的url
if(((HttpServletRequest) request).getServletPath().equals(page)){
isExcludedPage= true;break;
}else if(page.contains("*")&&((HttpServletRequest) request).getServletPath().startsWith("/"+page.split("/")[1])){
isExcludedPage= true;break;
}
}
}if (isExcludedPage) {//在过滤url之外
chain.doFilter(request, response);
}else{if(!HttpRequest.METHOD_GET.equalsIgnoreCase(request.getMethod()) &&
!HttpRequest.METHOD_POST.equalsIgnoreCase(request.getMethod())){
StandardResult resultBase= newStandardResult();
StringBuilder errmsg= newStringBuilder();
errmsg.append("禁止[" + request.getMethod() + "]方法访问;允许的方法为[");
errmsg.append(HttpRequest.METHOD_GET+ "]和[");
errmsg.append(HttpRequest.METHOD_POST+ "]");
resultBase.setStatus(StandardResult.FAIL);
resultBase.setMessage(String.valueOf(errmsg));
RenderHelper.render(resultBase, response);return;
}
Map values = new HashMap();if(HttpRequest.METHOD_GET.equals(request.getMethod())) {
values= MyRequestUtil.getParamsMap(request, "UTF-8");
}else{
values= MyRequestUtil.getParamsMap(request,null);
}
String clientId=values.get(requestClientAppId);
String channelKey= "";
_log.debug("********HttpRequestSignInputCheck requestParams**********" +values);
String queryString=SignCheck.createLinkString(values);
_log.info("请求的URL:" + request.getRequestURL().toString() + "?" +queryString);/*******验证渠道合法性********/
if(StringUtils.isBlank(clientId)) {
String respMsg= "clientId不能为空";
StandardResult resultBase= newStandardResult();
resultBase.setStatus(StandardResult.FAIL);
resultBase.setMessage(respMsg);
RenderHelper.render(resultBase, response);return;
}
Map params = new HashMap();
params.put("idClient", clientId);
StandardResult result= HttpClientUtils.sendHttpMethod(api_url+"/product/getClientInfo", params, Contants.HTTP_METHOD_POST);if (result.getData()!=null&&!"null".equals(String.valueOf(result.getData()))&&StringUtil.isNotEmpty(String.valueOf(result.getData()))) {
ClientInfoModel clientInfo= JSON.parseObject(String.valueOf(result.getData()),ClientInfoModel.class);if(clientInfo==null||StringUtil.isEmpty(clientInfo.getClientKey())){
String respMsg= "渠道商查询信息有误,请联系系统管理员!";
StandardResult resultBase= newStandardResult();
resultBase.setStatus(StandardResult.FAIL);
resultBase.setMessage(respMsg);
RenderHelper.render(resultBase, response);return;
}
channelKey=clientInfo.getClientKey();
}else{
result.setData("");
result.setCount(0);/*result.setMessage(Contants.MSG_CHANNELID_ERROR);
result.setStatus(Contants.STATUS_CHANNELID_ERROR);*/
if(StringUtils.isNotBlank(result.getMessage())){
result.setMessage(result.getMessage());
result.setStatus(result.getStatus());
}else{
result.setMessage(Contants.MSG_CHANNELID_ERROR);
result.setStatus(Contants.STATUS_CHANNELID_ERROR);
}
RenderHelper.render(result, response);return;
}if(!devMode){/**********验证签名**********/
boolean status = SignCheck.getSignVeryfy(values, values.get("sign"),channelKey);if (!status) {
StandardResult resultBase= newStandardResult();
resultBase.setStatus(StandardResult.SIGN_ERROR);
resultBase.setMessage("签名验证失败");
RenderHelper.render(resultBase, response);return;
}
}
_log.info("**********HttpRequestSignInputCheck finished***************");
chain.doFilter(req,response);
}
}
@Overridepublic void init(FilterConfig filterConfig) throwsServletException {
excludedPages= filterConfig.getInitParameter("excludedPages");if(StringUtils.isNotEmpty(excludedPages)){
excludedPagesArray= excludedPages.split(",");
}
}static{
api_url= PropConfigUtil.getValueByKey("api.url");
}
}