/**
*
*/
package com.chamago.cometserver;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationSupport;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import com.chamago.cometserver.connection.CometConnection;
import com.chamago.cometserver.connection.CometConnectionManager;
import com.chamago.cometserver.connection.ConfirmManager;
import com.chamago.cometserver.connection.RedisClientFactory;
import com.chamago.cometserver.connection.RedisClientManager;
import com.chamago.cometserver.connection.StreamCometConnection;
import com.chamago.cometserver.connection.StreamMsgPullFactory;
import com.chamago.cometserver.sercret.AppKeyManager;
import com.chamago.cometserver.sercret.CopUtils;
import com.chamago.cometserver.util.Constants;
import com.chamago.cometserver.util.RequestParametersHolder;
import com.chamago.cometserver.util.TaobaoHashMap;
public class ConfirmServlet extends HttpServlet {
private final static Log LOG = LogFactory
.getLog(ConfirmServlet.class);
private AppKeyManager akm;
//private JedisPool pool;
/**
*
*/
private static final long serialVersionUID = 7791301745498733988L;
@Override
public void init(ServletConfig config) {
LOG.info("启动消息回执确认服务");
this.akm = AppKeyManager.getInstance();
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
if(secretValidate(request,response)){
postMessage(request, response);
}else{
LOG.warn("消息回执确认校验参数失败,请客户端检查");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void postMessage(HttpServletRequest request,
HttpServletResponse response) throws IOException {
String msgIds = request.getParameter("confirm_ids");
String appkey = request.getParameter("app_key");
LOG.info("收到客户端"+appkey+"确认消息ID:"+msgIds);
// RedisClientManager rcm = RedisClientManager.getInstance();
// rcm.batchDeleteMsg(appkey, msgIds);
}
@Override
public void destroy() {
//this.pool.destroy();
}
/**
* 安全验证
* @throws IOException
*/
public boolean secretValidate(HttpServletRequest request, HttpServletResponse response) throws IOException{
String timestamp = request.getParameter("timestamp");
if(!checkTimestamp(timestamp)){
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setHeader(StreamConstants.ERR_MSG_HEADER, URLEncoder.encode("timestamp误差不在服务器允许的15分钟范围内 ,而且不能超过服务器时间","UTF-8"));
return false;
}
String sign = request.getParameter("sign");
RequestParametersHolder requestHolder = this.praseReqParams(request);
String appkey = request.getParameter("app_key");
String app_secret = this.akm.findSecret(appkey);
if(app_secret!=null){
String serSign = CopUtils.signCopRequest(requestHolder,app_secret);
if(!sign.equals(serSign)){
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setHeader(StreamConstants.ERR_MSG_HEADER,URLEncoder.encode("签名无效,请检查appkey对应的密钥","UTF-8") );
return false;
}
}else{
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setHeader(StreamConstants.ERR_MSG_HEADER, URLEncoder.encode("appkey["+appkey+"]不存在,请客户端检查","UTF-8"));
return false;
}
return true;
}
public boolean checkTimestamp(String timestamp){
long cts = Long.parseLong(timestamp);
long now = System.currentTimeMillis();
if(now-cts>Constants.VALID_TIMESTAMP){
return false;
}else if(cts-now>0){
return false;
}
return true;
}
public RequestParametersHolder praseReqParams(HttpServletRequest request) throws IOException {
TaobaoHashMap protocalMustParams = new TaobaoHashMap();
Iterator<String> it = request.getParameterMap().keySet().iterator();
while (it.hasNext()) {
String name = it.next();
if(!name.equals("sign")){
String value = URLDecoder.decode(request.getParameter(name), "UTF-8");
protocalMustParams.put(name, value);
}
}
RequestParametersHolder requestHolder = new RequestParametersHolder();
requestHolder.setProtocalMustParams(protocalMustParams);
return requestHolder;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}