<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    #

    自定義注釋與操作行為記錄

    自定義注釋就是一個標記,一個信息收集器,如果配合SPRING的AOP使用,可以記錄用戶的操作行為。

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    /**
     * 新增的用法:@Audit(behaviour="新增了專題", 
     *            value="#{args[0].colSubject}")
     *
     * 修改的用法:@Audit(behaviour="修改了專題", id="#{args[0].colSubject.id}", 
     *            className="com.paul.program.colsubject.valueobject.ColSubject",
     *            value="#{args[0].colSubject}")
     *
     * 刪除的用法:@Audit(behaviour="刪除了專題", id="#{args[0].colSubject.id}"
     *             className="com.paul.program.colsubject.valueobject.ColSubject")
     *             
     * 
    @author PAUL
     *
     
    */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Audit {
        
        String id() default "";
        String className() default "";
        String collectionName() default "";
        String value() default "";
        String behaviour();

    }


    值對象
    AuditData.java
    package com.paul.common.audit;

    import java.io.Serializable;
    import java.util.Date;

    import org.codehaus.jackson.annotate.JsonProperty;
    import org.codehaus.jackson.map.annotate.JsonSerialize;
    import org.springframework.data.annotation.CreatedBy;
    import org.springframework.data.annotation.CreatedDate;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.mongodb.core.mapping.Field;

    import com.paul.common.util.jackson.CustomJsonDateSerializer;

    @Document(collection = "auditdata")
    public class AuditData implements Serializable{

        private static final long serialVersionUID = -4011585863836336249L;
        
        @Id
        private String id;
        
        @CreatedBy
        @Field("userid")
        @JsonProperty("userid")
        private String userId;
        
        @CreatedDate
        @Field("createdate")
        @JsonProperty("createdate")
        @JsonSerialize(using = CustomJsonDateSerializer.class)
        private Date createDate;
        
        private String behaviour;
        
        @Field("newvalue")
        @JsonProperty("newvalue")
        private String newValue;
        
        @Field("oldvalue")
        @JsonProperty("oldvalue")
        private String oldValue;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getUserId() {
            return userId;
        }

        public void setUserId(String userId) {
            this.userId = userId;
        }

        public Date getCreateDate() {
            return createDate;
        }

        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }

        public String getBehaviour() {
            return behaviour;
        }

        public void setBehaviour(String behaviour) {
            this.behaviour = behaviour;
        }


        public String getNewValue() {
            return newValue;
        }

        public void setNewValue(String newValue) {
            this.newValue = newValue;
        }

        public String getOldValue() {
            return oldValue;
        }

        public void setOldValue(String oldValue) {
            this.oldValue = oldValue;
        }

        public String toString() {
            return "AuditData [id=" + id + ", userId=" + userId + ", createDate="
                    + createDate + ", behaviour=" + behaviour + ", newValue="
                    + newValue + ", oldValue=" + oldValue + "]";
        }
        

    }


    RootObject.java
    package com.paul.common.audit;

    public class RootObject {

        private final Object[] args;

        private final Object invokedObject;

        private final Object returned;

        private final Throwable throwned;

        public RootObject(Object invokedObject, Object[] args, Object returned, Throwable throwned) {
            super();
            this.invokedObject = invokedObject;
            this.args = args;
            this.returned = returned;
            this.throwned = throwned;
        }

        public Object[] getArgs() {
            return args;
        }

        public Object getInvokedObject() {
            return invokedObject;
        }

        public Object getReturned() {
            return returned;
        }

        public Throwable getThrowned() {
            return throwned;
        }

    }


    TemplateParserContext.java
    package com.paul.common.audit;

    import org.springframework.expression.ParserContext;

    public class TemplateParserContext implements ParserContext {

        public String getExpressionPrefix() {
            return "#{";
        }

        public String getExpressionSuffix() {
            return "}";
        }

        public boolean isTemplate() {
            return true;
        }
    }


    獲取用戶ID
    package com.paul.common.audit.aware;

    import javax.servlet.http.HttpServletRequest;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.data.domain.AuditorAware;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;

    import com.paul.common.constant.Constants;
    import com.paul.program.account.valueobject.Account;

    @Component
    public class MyAppAuditor implements AuditorAware<String> {
        
        private static Logger logger = LoggerFactory.getLogger(MyAppAuditor.class);

        // get your user name here
        public String getCurrentAuditor() {
            
            String result = "N/A";
            try {
                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
                        .getRequestAttributes()).getRequest();
                Account account = (Account)request.getSession().getAttribute(Constants.USER_INFO);
                result = account.getLoginName();
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
            return result;
        }
    }


    切面
    package com.paul.common.audit.interceptor;

    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.TimeUnit;

    import org.apache.commons.lang.builder.ToStringBuilder;
    import org.apache.commons.lang.builder.ToStringStyle;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.expression.EvaluationException;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.ParseException;
    import org.springframework.expression.ParserContext;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    import org.springframework.stereotype.Component;

    import com.paul.common.audit.AuditData;
    import com.paul.common.audit.AuditDataRequest;
    import com.paul.common.audit.RootObject;
    import com.paul.common.audit.TemplateParserContext;
    import com.paul.common.audit.annotation.Audit;
    import com.paul.common.audit.service.AuditDataService;
    import com.paul.common.util.StringUtils;

    @Component
    @Aspect
    public class AuditAspect {
        
        private static Logger logger = LoggerFactory.getLogger(AuditAspect.class);
        
        @Autowired
        private AuditDataService auditDataService;
        
        @Autowired
        private MongoTemplate mongoTemplate;
        
        private SimpleDateFormat dateFormatPrototype = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        private Map<String, Expression> expressionCache = new ConcurrentHashMap<String, Expression>();

        private ExpressionParser expressionParser = new SpelExpressionParser();

        private ParserContext parserContext = new TemplateParserContext();
        

        protected static void appendThrowableCauses(Throwable throwable, String separator, StringBuilder toAppendTo) {
            List<Throwable> alreadyAppendedThrowables = new ArrayList<Throwable>();

            while (throwable != null) {
                // append
                toAppendTo.append(throwable.toString());
                alreadyAppendedThrowables.add(throwable);

                // cause
                Throwable cause = throwable.getCause();
                if (cause == null || alreadyAppendedThrowables.contains(cause)) {
                    break;
                } else {
                    throwable = cause;
                    toAppendTo.append(separator);
                }
            }
        }
        
        private String getValueByEl(String template, Object invokedObject, Object[] args, Object returned, Throwable throwned)
        {
            String result = "N/A";
            if(StringUtils.isBlank(template))
                return result;
            try {
                Expression expression = expressionCache.get(template);
                if (expression == null) {
                    expression = expressionParser.parseExpression(template, parserContext);
                    expressionCache.put(template, expression);
                }

                Object evaluatedMessage = expression.getValue(new RootObject(invokedObject, args, returned, throwned), Object.class);
                result = evaluatedMessage.toString();
            } catch (ParseException e) {
                logger.error(e.getMessage(), e);
            } catch (EvaluationException e) {
                logger.error(e.getMessage(), e);
            }
            return result;
        }


        protected AuditData buildAuditData(Audit auditAnnotation, Object invokedObject, Object[] args, Object returned, Throwable throwned, long durationInNanos) {
            
            AuditData auditData = new AuditData();
            auditData.setBehaviour(auditAnnotation.behaviour());
            String id = this.getValueByEl(auditAnnotation.id(), invokedObject, args, returned, throwned);
            auditData.setOldValue(this.getOldValueToString(id, auditAnnotation.className()));
            try {
                String newValue = this.getValueByEl(auditAnnotation.value(), invokedObject, args, returned, throwned);
                auditData.setNewValue(newValue);

                StringBuilder msg = new StringBuilder();

                SimpleDateFormat simpleDateFormat = (SimpleDateFormat) dateFormatPrototype.clone();
                msg.append(simpleDateFormat.format(new Date()));
    //            auditData.setCreateDate(simpleDateFormat.format(new Date()));

                msg.append(" ").append(newValue);

                if (throwned != null) {
                    msg.append(" threw '");
                    appendThrowableCauses(throwned, ", ", msg);
                    msg.append("'");
                }
                msg.append(" by ");
                String user = this.getUser();
                if (user == null) {
                    user = "anonymous";
                } 
                msg.append(" in ") .append(TimeUnit.MILLISECONDS.convert(durationInNanos, TimeUnit.NANOSECONDS)).append(" ms");
                return auditData;
            } catch (Exception e) {
                /*StringBuilder msg = new StringBuilder("Exception evaluating template '" + template + "': ");
                appendThrowableCauses(e, ", ", msg);
    */
                return auditData;
            }
        }
        
        private String getOldValueToString(/*ProceedingJoinPoint proceedingJoinPoint,*/ String id, String className) 
        {
            String result = "N/A";
            /*String id = "5385be613d2a47eec07c53d4";
            try {
                MethodSignature methodSig = (MethodSignature) proceedingJoinPoint.getSignature();
                Object target = proceedingJoinPoint.getTarget();
                Object newValue = proceedingJoinPoint.getArgs()[0];
                String findMethodName = "findOne";
                Object oldValue=null;
                Method findMethod = target.getClass().getDeclaredMethod(findMethodName, (Class<?>[])null);
                oldValue = findMethod.invoke(target, (Object[]) null);

            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
    */
            if(StringUtils.isBlank(id) || StringUtils.isBlank(className))
                return result;
            
            try {
                Object object = mongoTemplate.findById(id, Class.forName(className));
                result = ToStringBuilder.reflectionToString(object,  ToStringStyle.SHORT_PREFIX_STYLE); 
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
            return result;
        }
        
    //    @Around("execution(* com.paul..**.repository..*(..))")
        @Around("@annotation(auditAnnotation)")
        public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint, Audit auditAnnotation) throws Throwable {
            
            boolean ok = false;
            Object o = null;
            AuditData auditData = null;
            try 
            {
                auditData = buildAuditData(auditAnnotation, proceedingJoinPoint.getThis(), 
                        proceedingJoinPoint.getArgs(), 
                        o, null, 10);
                o = proceedingJoinPoint.proceed();
                ok = true;
                return o;
            } 
            finally 
            {
                if (ok)
                {
    //                String value = (MessageFormat.format(auditAnnotation.value(), proceedingJoinPoint.getArgs()));
                    try 
                    {
                        AuditDataRequest auditDataRequest = new AuditDataRequest();
                        auditDataRequest.setAuditData(auditData);
                        auditDataService.addAuditData(auditDataRequest);
                        logger.info(auditData + "");
                    } 
                    catch (Exception e) 
                    {
                        logger.error(e.getMessage(), e);
                    }
                }    
            }
        }
        
        private String getUser()
        {
            return "Paul";
        }
        

    }


    保存至數據庫
    package com.paul.common.audit.service;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.stereotype.Service;

    import com.paul.common.audit.AuditData;
    import com.paul.common.audit.AuditDataRequest;
    import com.paul.common.audit.annotation.Audit;
    import com.paul.common.audit.repository.AuditDataRepository;
    import com.paul.program.colsubject.valueobject.ColSubjectRequest;

    @Service
    public class AuditDataService {
        
        @Autowired
        private AuditDataRepository auditDataRepository;
        
    //    @Audited(message = "save(#{args[0].name}, #{args[0].email}): #{returned?.id}")
        @Audit(behaviour="修改了審計", id="#{args[0].colSubject.id}", 
                className="com.paul.program.colsubject.valueobject.ColSubject",
                value="#{args[0].colSubject}")
        public void saveObject(ColSubjectRequest colSubjectRequest)
        {
            
        }
        
        @Audit(behaviour="刪除了專題", id="#{args[0]}",
                 className="com.paul.program.subject.valueobject.Subject")
        public void delete(String id) {
        }
        
        @Audit(behaviour="新增了專題", value="#{args[0].colSubject}")
        public void add(ColSubjectRequest colSubjectRequest) {
        }
        
        public AuditData addAuditData(AuditDataRequest auditDataRequest)
        {
            return auditDataRepository.save(auditDataRequest.getAuditData());
        }
        
        public Page<AuditData> findAll(AuditDataRequest auditDataRequest)
        {
            Page<AuditData> page = auditDataRepository.findAll(auditDataRequest.getPageable());
            return page;
        }

    }


    DAO
    package com.paul.common.audit.repository;

    import org.springframework.data.repository.PagingAndSortingRepository;

    import com.paul.common.audit.AuditData;

    /**
     * 審計
     * 
     
    */
    public interface AuditDataRepository extends PagingAndSortingRepository<AuditData, String>{
        
    }

    posted @ 2014-07-25 14:56 paulwong 閱讀(1370) | 評論 (0)編輯 收藏

    推薦系統開源軟件列表

    收集和整理了目前互聯網上能找到的和推薦系統相關的開源項目

    posted @ 2014-07-23 20:51 paulwong 閱讀(355) | 評論 (0)編輯 收藏

    SNAKER

    一個開源的國產的工作流引擎,可以自定義表單。
    http://snakerflow.com/index.html

    posted @ 2014-07-23 09:16 paulwong 閱讀(352) | 評論 (0)編輯 收藏

    Java并行處理框架 JPPF

    JPPF是一個MASTER/SLAVE的結構,提供客戶端的JAR包,客戶端只要把執行的代碼封閉成一個TASK并提交到MASTER中,MASTER會把此任務分派給SLAVE/NODE去執行,然后把結果返回。

    http://www.jppf.org/doc/v4/index.php?title=Main_Page

    posted @ 2014-07-19 09:55 paulwong 閱讀(451) | 評論 (0)編輯 收藏

    Tomcat Mongo Access Log

    Tomcat Mongo Access Log 是一個將 Tomcat access log 記錄到 MongoDB 的插件。

    使用方式和Tomcat自帶的AccessLogValve基本一致,只需要簡單配置就能夠實現將日志存入到mongodb的功能。

    例子(替換掉server.xml中原來的AccessLogValve配置):

    <!--
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log." suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    -->
    <Valve 
    className="chanjarster.tomcat.valves.MongoAccessLogValve" 
    uri
    ="mongodb://url/to/mongodb"
    pattern
    ="all" />

    詳細使用方式可見項目主頁README.

    https://github.com/chanjarster/tomcat-mongo-access-log

    posted @ 2014-07-19 08:31 paulwong 閱讀(361) | 評論 (0)編輯 收藏

    教程資源

    http://www.alexecollins.com/

    posted @ 2014-07-18 12:06 paulwong 閱讀(231) | 評論 (0)編輯 收藏

    Audit in Spring AOP

    Auditing entities in Spring Data MongoDB
    http://maciejwalkowiak.pl/blog/2013/05/24/auditing-entities-in-spring-data-mongodb/


    xebia-spring-security-extras
    https://github.com/xebia-france/xebia-spring-security-extras/wiki/AuditedAnnotation


    Spring Logging using custom annotation
    http://stackoverflow.com/questions/15298164/spring-logging-using-custom-annotation


    Spring MVC and MongoDB - Auditing Actions
    http://www.alexecollins.com/content/spring-mvc-and-mongodb-auditing-actions/


    audit-aspectj 
    https://github.com/roghughe/captaindebug/tree/master/audit-aspectj

    posted @ 2014-07-18 09:50 paulwong 閱讀(513) | 評論 (0)編輯 收藏

    TOMCAT性能調優

    http://my.oschina.net/leejayblog/blog?catalog=517328


    tomcat7.0性能優化-挑戰極限完整版
    http://my.oschina.net/boltwu/blog/402271

    posted @ 2014-07-17 08:43 paulwong 閱讀(414) | 評論 (0)編輯 收藏

    2013年度最強AngularJS資源合集

    AngularJS是Google開源的一款JavaScript MVC框架,彌補了HTML在構建應用方面的不足,其通過使用指令(directives)結構來擴展HTML詞匯,使開發者可以使用HTML來聲明動態內容,從而使得Web開發和測試工作變得更加容易。

    AngularJS誕生以來,吸引了大量的目光,也迅速成為了Web開發領域的新寵。本文整理了2013年度一些非常有價值的AngularJS相關教程和資源,如果你想了解AngularJS或正在使用AngularJS,那么這些資源肯定會為你的學習和進階過程帶來幫助。

    一、了解AngularJS

    二、中文資源

    1. 中文系列資源

    2. 其他單篇文章

    3. 中文書籍

    三、英文資源

    1. AngularJS入門教程

    2. AngularJS指令學習

    3. AngularJS應用開發實戰

    4. AngularJS游戲開發實戰

    5. AngularJS工作流程和測試

    6. AngularJS書籍

    posted @ 2014-07-16 09:01 paulwong 閱讀(414) | 評論 (0)編輯 收藏

    網購狂歡節背后的技術閱兵

    2013年是雙11的第五個年頭,從2009年的“光棍節”到現在的“網購狂歡節”,單單是名字上的變化,大家就能從中感受到業務規模發生的轉變。

    posted @ 2014-07-16 08:46 paulwong 閱讀(258) | 評論 (0)編輯 收藏

    僅列出標題
    共115頁: First 上一頁 47 48 49 50 51 52 53 54 55 下一頁 Last 
    主站蜘蛛池模板: 亚洲欧洲日产国码二区首页| 亚洲熟妇av一区二区三区| 亚洲二区在线视频| 国产成人精品免费午夜app | 亚洲短视频在线观看| 91免费资源网站入口| 午夜在线亚洲男人午在线| 四虎亚洲国产成人久久精品| h片在线观看免费| 亚洲系列国产精品制服丝袜第| 国产美女亚洲精品久久久综合| 免费无码一区二区三区 | 国产一卡二卡四卡免费| 亚洲欧美aⅴ在线资源| 国产又黄又爽又猛的免费视频播放 | 亚洲精品无码专区在线| 久久亚洲熟女cc98cm| 国产精品免费小视频| 手机在线看永久av片免费| 精品无码无人网站免费视频 | 日本免费一二区在线电影| 在线观看亚洲视频| 亚洲精品无码不卡在线播放| 亚洲一区二区三区免费在线观看| 日本免费一本天堂在线| 日韩吃奶摸下AA片免费观看| 国产日韩AV免费无码一区二区三区| 亚洲大片免费观看| 91久久亚洲国产成人精品性色| 亚洲成AV人在线观看天堂无码| 成人a免费α片在线视频网站| 波霸在线精品视频免费观看| 最新亚洲卡一卡二卡三新区| 亚洲午夜国产精品无码老牛影视| 亚洲国产成人久久一区WWW| 91在线视频免费91| 国内免费高清在线观看| 成熟女人特级毛片www免费| 男人的天堂网免费网站| 窝窝影视午夜看片免费| 亚洲日本一线产区和二线 |