当前位置:  编程技术>移动开发
本页文章导读:
    ▪sign 阻截        sign 拦截 <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-.........
    ▪ objective-c中的 内存储器管理(六)        objective-c中的 内存管理(六) holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7350318   objective c中的内存管理是很让人.........
    ▪ 文档资源目录       文档资源索引 http://www.ostools.net/ ......

[1]sign 阻截
    来源: 互联网  发布时间: 2014-02-18
sign 拦截
<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=*************************

    
[2] objective-c中的 内存储器管理(六)
    来源: 互联网  发布时间: 2014-02-18
objective-c中的 内存管理(六)

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来查看,如下:

 

[plain] view plaincopy
 
  • #import <Foundation/Foundation.h>  
  • @interface Man:NSObject  
  • -(void)say;  
  • @end  
  • @implementation Man  
  •   
  • -(void)say  
  • {  
  •     NSLog(@"man say");  
  • }  
  •   
  • @end  
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •       
  •         Man *man1=[Man new];  
  •         NSLog(@"%lu",[man1 retainCount]);  
  •         [man1 release];  
  •      
  •     return 0;  
  • }  


  •  

     

    [plain] view plaincopy
     
  • 2012-03-13 20:14:38.559 retain[2906:403] 1  
  • 当不再使用该对象时,要用release方法将该内存释放。

     

    当不是用以上介绍的三种方法创建对象的话,我们不需要使用release方法手动释放,但是其计数仍为1,只是系统会自动释放。有的时候我们会长久使用一些对象,比如某些对象本身作为别的对象的参数之类又或者将其加入数组之类的,我们需要手动增加一个计数,retain一下,需要注意的是每retain一次,都要对应的有一个release,具体retain多少次,什么时候释放需要看代码环境,但是这个原则是肯定的,每retain一次,就要release释放一次。下面看一部分代码来理顺一下思路 :

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • @interface Man:NSObject  
  • -(void)say;  
  • @end  
  • @implementation Man  
  •   
  • -(void)say  
  • {  
  •     NSLog(@"man say");  
  • }  
  •   
  • @end  
  • int main(int argc, const char * argv[])  
  • {  
  •     Man *man =[Man new];//生成一个新对象man,引用计数为1  
  •     NSLog(@"%lu",[man retainCount]);//  
  •     [man retain];//手动增加一个引用计数用以保留man对象,引用计数为2  
  •     NSLog(@"%lu",[man retainCount]);  
  •     [man release];//手动释放一个引用计数,现在count为1  
  •     NSLog(@"%lu",[man retainCount]);  
  •     [man release];//再释放一个,这时man对象的内存已经被抹掉了  
  •     //[man say];如果这个方法不注释的话就会报错。  
  •     NSLog(@"%lu",[man retainCount]);  
  •     //这里之所以还为1,是因为这里是以man方法调用的,所以这里又生成了一个不知名的对象,但是这个对象中并没有  
  •     //say方法了,但是因为这里重新用man引用了这片内存,所以计数仍为1.  
  •     return 0;  
  •       
  •   
  • }  
  •  

    [plain] view plaincopy
     
  • 2012-03-13 20:34:44.440 String[3870:403] 1  
  • 2012-03-13 20:34:44.443 String[3870:403] 2  
  • 2012-03-13 20:34:44.444 String[3870:403] 1  
  • 2012-03-13 20:34:44.445 String[3870:403] 1  
  •  

     

     另外,objective c中引入了autorelease 和autorelease pool(自动释放对象池)的概念,可以自动释放对象。

    Man *man =[[Man new] autorelease];这时就不用再释放。

    自动释放池可以手动创建:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • @interface Man:NSObject  
  • -(void)say;  
  • @end  
  • @implementation Man  
  •   
  • -(void)say  
  • {  
  •     NSLog(@"man say");  
  • }  
  •   
  • @end  
  • int main(int argc, const char * argv[])  
  • {  
  •     NSAutoreleasePool *pool;  
  •     pool =[[NSAutoreleasePool alloc] init];  
  •       
  •     Man *man1;  
  •     Man *man2;  
  •     //可以将好好多对象放入一个自动释放池;  
  •     [man1 autorelease];  
  •     [man2 autorelease];  
  •     //然后可以一下子释放池里所有的对象;  
  •     [pool release];//相当于对池中每个对象执行了一次release;  
  •       
  •   
  • }  
  •  

     

    一般情况下,只要在有new,alloc,copy出现后,记得要release,在手动retain后,记得也肯定会有release,并且retain和release是对应在一个对象身上,这样就不会出现问题。额,先这样吧,等什么时候有补充我再作更改,憋不住了,上厕所去。

     

     

     

    关键字:objective-c ,objective c , oc ,内存管理,release, retain, copy ,alloc ,new


        
    [3] 文档资源目录
        来源: 互联网  发布时间: 2014-02-18
    文档资源索引

    http://www.ostools.net/


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3