欢迎使用CSDN-markdown编辑器

java 自定义注解的定义与使用

注解类

package com.yesmywine.jwt.customPerm;

import java.lang.annotation.*;

/**
 * Created by by on 2017/8/3.
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SecurestValid {
    public String value();
}

使用切面切入controller

package com.yesmywine.jwt.customPerm;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yesmywine.db.base.biz.RedisCache;
import com.yesmywine.jwt.thread.LogThread;
import com.yesmywine.util.basic.Statement;
import com.yesmywine.util.basic.ValueUtil;
import com.yesmywine.util.error.YesmywineException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;

/**
 * Created by by on 2017/8/3.
 */
@Aspect
@Component
public class SecurestAspect {


    private  static  final Logger logger = LoggerFactory.getLogger(SecurestAspect. class);

    //Controller层切点 包路径 可为多个
    @Pointcut("execution (* com.yesmywine.*.controller..*(..))")
    public  void controllerAspect() {
    }

    private String getOperation(String requestPerm,String userInfo) {
        String userPerms = ValueUtil.getFromJson(userInfo,"allPerms");
        JSONObject jsonObject = JSON.parseObject(userPerms);
        return jsonObject.getString(requestPerm);
    }

    /**
     * 前置通知 用于拦截Controller层记录用户的操作
     *
     * @param joinPoint 切点
     */
    @Before("controllerAspect()")
    public void doBefore(JoinPoint joinPoint) throws ClassNotFoundException, YesmywineException {
        System.out.println("==========执行controller前置通知===============");
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String perm = request.getHeader("RequestPerm");
        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        String value = "";
        String operationName = "";
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                if (clazzs.length == arguments.length) {
                    if(method.getAnnotation(SecurestValid.class)!=null){
                        value = method.getAnnotation(SecurestValid.class).value();
                        if(!perm.equals(value)){
                            ValueUtil.isError("您无此权限");
                        }
                    }
        //            String userInfo = RedisCache.get(Statement.USER_INFO+username);
        //            String operation = getOperation(perm,userInfo);
        //
        //            if(operation==null){
        //                ValueUtil.isError("请求权限 RequestPerm 参数,无效的操作");
        //            }
        //            LogThread logThread = new LogThread(username,operation);
        //            Thread thread = new Thread(logThread);
        //            thread.start();

                    break;
                }
            }
        }

        if(logger.isInfoEnabled()){
            logger.info("before " + joinPoint);
        }
    }

    //配置controller环绕通知,使用在方法aspect()上注册的切入点
    @Around("controllerAspect()")
    public Object around(JoinPoint joinPoint) throws ClassNotFoundException{
        System.out.println("==========开始执行controller环绕通知===============");
        long start = System.currentTimeMillis();
        try {
            //obj 为controller的返回值
            Object obj = ((ProceedingJoinPoint) joinPoint).proceed();
            long end = System.currentTimeMillis();
            if(logger.isInfoEnabled()){
                logger.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!");
            }
            System.out.println("==========结束执行controller环绕通知===============");
            return obj;
        } catch (YesmywineException e) {
            return ValueUtil.toError(e.getCode(),e.getMessage());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }

    /**
     * 后置通知 用于拦截Controller层记录用户的操作
     *
     * @param joinPoint 切点
     */
    @After("controllerAspect()")
    public  void after(JoinPoint joinPoint) throws ClassNotFoundException, YesmywineException {

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        String perm = request.getHeader("RequestPerm");
        //读取session中的用户
        // User user = (User) session.getAttribute("user");
        //请求的IP
        String ip = request.getRemoteAddr();

        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        String value = "";
        String operationName = "";
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                if (clazzs.length == arguments.length) {
//                    System.out.println(method.getAnnotation(SecurestValid.class));
//                    value = method.getAnnotation(SecurestValid.class).value();
//                        operationName = method.getAnnotation(SecurestAspect.class).operationName();
                    break;
                }
            }
        }
        //*========控制台输出=========*//
        System.out.println("=====controller后置通知开始=====");
        System.out.println("请求方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+value);
        System.out.println("方法描述:" + operationName);
//            System.out.println("请求人:" + user.getName());
        System.out.println("请求IP:" + ip);
        System.out.println("=====controller后置通知结束=====");
    }

    //配置后置返回通知,使用在方法aspect()上注册的切入点
    @AfterReturning("controllerAspect()")
    public void afterReturn(JoinPoint joinPoint) throws YesmywineException {
        System.out.println("=====执行controller后置返回通知=====");
//        ValueUtil.isError("888888888");
        if(logger.isInfoEnabled()){
            logger.info("afterReturn " + joinPoint);
        }
    }

    /**
     * 异常通知 用于拦截记录异常日志
     *
     * @param joinPoint
     * @param e
     */
//    @AfterThrowing(pointcut = "controllerAspect()", throwing="e")
//    public  String  doAfterThrowing(JoinPoint joinPoint, Throwable e) throws YesmywineException{
//        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        HttpSession session = request.getSession();
//        //读取session中的用户
//        //获取请求ip
//        String ip = request.getRemoteAddr();
//        //获取用户请求方法的参数并序列化为JSON格式字符串
//
//        String params = "";
//        if (joinPoint.getArgs() !=  null && joinPoint.getArgs().length > 0) {
//            for ( int i = 0; i < joinPoint.getArgs().length; i++) {
                params += JsonUtil.getJsonStr(joinPoint.getArgs()[i]) + ";";
//                params += joinPoint.getArgs()[i] ;
//            }
//        }
//        try {
//
//            String targetName = joinPoint.getTarget().getClass().getName();
//            String methodName = joinPoint.getSignature().getName();
//            Object[] arguments = joinPoint.getArgs();
//            Class targetClass = Class.forName(targetName);
//            Method[] methods = targetClass.getMethods();
//            String operationType = "";
//            String operationName = "";
//            for (Method method : methods) {
//                if (method.getName().equals(methodName)) {
//                    Class[] clazzs = method.getParameterTypes();
//                    if (clazzs.length == arguments.length) {
//                        operationType = method.getAnnotation(SecurestValid.class).value();
                        operationName = method.getAnnotation(Log.class).operationName();
//                        break;
//                    }
//                }
//            }
//             /*========控制台输出=========*/
//            System.out.println("=====异常通知开始=====");
//            System.out.println("异常代码:" + e.getClass().getName());
//            System.out.println("异常信息:" + e.getMessage());
//            System.out.println("异常方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+"."+operationType);
//            System.out.println("方法描述:" + operationName);
            System.out.println("请求人:" + user.getName());
            System.out.println("请求IP:" + ip);
//            System.out.println("请求参数:" + params);
//               /*==========数据库日志=========*/
//            System.out.println("=====异常通知结束=====");
//        }  catch (Exception ex) {
//            //记录本地异常日志
//            logger.error("==异常通知异常==");
//            logger.error("异常信息:{}", ex.getMessage());
//        }
//         /*==========记录本地异常日志==========*/
//        logger.error("异常方法:{}异常代码:{}异常信息:{}参数:{}", joinPoint.getTarget().getClass().getName() + joinPoint.getSignature().getName(), e.getClass().getName(), e.getMessage(), params);
//        return null;
//    }
}

controller中的使用

package com.yesmywine.activity.controller;

import com.yesmywine.activity.ifttt.entity.Activity;
import com.yesmywine.activity.ifttt.service.ActivityService;
import com.yesmywine.activity.ifttt.service.IftttService;
import com.yesmywine.base.record.bean.PageModel;
import com.yesmywine.util.basic.MapUtil;
import com.yesmywine.util.basic.ValueUtil;
import com.yesmywine.util.error.YesmywineException;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Created by wangdiandian on 2017/1/10.
 */
@RestController
@RequestMapping("/activity")
public class ActivityController {
    @Autowired
    private ActivityService activityService;
    @Autowired
    private IftttService iftttService;
    @SecurestValid("/test")
    @RequestMapping(method = RequestMethod.POST)
    public String createActivity(@RequestParam Map<String, String> param, HttpServletRequest request) {//创建活动
        try {
            return ValueUtil.toJson(HttpStatus.SC_CREATED, activityService.createActivity(param,request));
        } catch (YesmywineException e) {
            return ValueUtil.toError(e.getCode(), e.getMessage());
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值