<beans profile="product,test_sce,test,local"> <context:component-scan base-package="cn.focus.dc.jiajing.interceptors"> <context:include-filter type="regex" expression=".*Interceptor" /> </context:component-scan> </beans>
package cn.focus.dc.jiajing.interceptors;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import cn.focus.dc.commons.controllers.CommonsController;
import cn.focus.dc.config.MsgConstant;
import net.paoding.rose.web.ControllerInterceptorAdapter;
import net.paoding.rose.web.Invocation;
/**
* 拦截所有controller方法,对于sign不匹配的连接均拦截
*/
public class SignInterceptor extends ControllerInterceptorAdapter {
private static Logger logger = Logger.getLogger(SignInterceptor.class);
public SignInterceptor(){
this.setPriority(200);
}
@Override
protected boolean isForAction(Method actionMethod, Class<?> controllerClazz) {
if (controllerClazz.equals(CommonsController.class)) {
return Boolean.FALSE;
}
return super.isForAction(actionMethod, controllerClazz);
}
@Override
public Object before(Invocation inv) throws Exception {
String sign = inv.getRequest().getParameter("sign");
Map<String, String[]> params = inv.getRequest().getParameterMap();
String result = DigestUtils.md5Hex(getSignedParams(convertMap(params), MsgConstant.SIGN_MD5_KEY));
logger.info("result===" + result + "\n\t\tsign===" + sign);
if (result.equals(sign)) {
String accessToken = inv.getRequest().getParameter("access_token");
logger.debug("uri===" + result + "\n\t\taccess_token===" + accessToken);
return Boolean.TRUE;
}
logger.info("result===:" + result + "\t\ttime:" + System.nanoTime());
return "@sign error!";
}
private Map<String, String> convertMap(Map<String, String[]> params) {
Map<String, String> map = new HashMap<String, String>();
if (params == null || params.size() == 0) {
return map;
}
for (Map.Entry<String, String[]> entry : params.entrySet()) {
if (entry.getValue() != null && entry.getValue().length > 0) {
map.put(entry.getKey(), entry.getValue()[0]);
}
}
return map;
}
private String getSignedParams(Map<String, String> params, String secretKey) {
Map<String, String> ret = new TreeMap<String, String>(params);
StringBuilder sb = new StringBuilder();
for (String key : ret.keySet()) {
sb.append(key).append("=").append(params.get(key));
sb.append("&");
}
return StringUtils.chomp(sb.toString(), "&") + secretKey;
}
}
String SIGN_MD5_TEST_KEY = new PropertiesUtil().getProperties("/config.properties", "sign.test");
public static String SIGN_MD5_ONLINE_KEY = new PropertiesUtil().getProperties("/config.properties", "sign.online");
sign.test=********** sign.online=*************************
holydancer原创,如需转载,请在显要位置注明:
转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7350318
objective c中的内存管理是很让人纠结的,如果程序从头到尾没有遇到内存泄漏或者别的内存问题倒也罢,如果一旦内存上出现了问题,那排起错来真是要人命啊,今天笔者大致介绍一下内存的实现原理,希望能在将来碰到内存问题时能够有些头绪。
我们都知道每个类在创造实例时都会在内存中给它划分一片区域用来存放信息,然后对象名作为指针指向该内存空间,如果这个对象不用了,那么这片内存区域就会被系统回收,抹掉内容或者覆盖上别的内容,objective c中没有java中那么强大的垃圾回收机制,网上有人称其为半自动模式,相当形象。那么我们通过什么来判断这个内存空间是否仍在使用呢,这里就需要引入一个概念:“引用计数(reference couting)”.当该对象创建时,该计数为1,说明有一个引用,如果不用时,就会减为0,这就表示不再使用了,那么就会销毁该空间。
引用计数会在使用new,alloc,copy创建对象时,会自动将引用计数设为1,可以通过retainCount来查看,如下:
当不再使用该对象时,要用release方法将该内存释放。
当不是用以上介绍的三种方法创建对象的话,我们不需要使用release方法手动释放,但是其计数仍为1,只是系统会自动释放。有的时候我们会长久使用一些对象,比如某些对象本身作为别的对象的参数之类又或者将其加入数组之类的,我们需要手动增加一个计数,retain一下,需要注意的是每retain一次,都要对应的有一个release,具体retain多少次,什么时候释放需要看代码环境,但是这个原则是肯定的,每retain一次,就要release释放一次。下面看一部分代码来理顺一下思路 :
另外,objective c中引入了autorelease 和autorelease pool(自动释放对象池)的概念,可以自动释放对象。
Man *man =[[Man new] autorelease];这时就不用再释放。
自动释放池可以手动创建:
一般情况下,只要在有new,alloc,copy出现后,记得要release,在手动retain后,记得也肯定会有release,并且retain和release是对应在一个对象身上,这样就不会出现问题。额,先这样吧,等什么时候有补充我再作更改,憋不住了,上厕所去。
关键字:objective-c ,objective c , oc ,内存管理,release, retain, copy ,alloc ,new
http://www.ostools.net/