08 SSM整合案例(企業權限管理系統):11.AOP日誌

04.AdminLTE的基本介紹html

05.SSM整合案例的基本介紹web

06.產品操做spring

07.訂單操做sql

08.權限控制數據庫

09.用戶和角色操做session

10.權限關聯mybatis

11.AOP日誌app

11.AOP日誌


 

 一、數據庫與表結構 

 

 

 1.2.sql語句

框架

CREATE TABLE sysLog(
id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,
visitTime timestamp,
username VARCHAR2(50),
ip VARCHAR2(30),
url VARCHAR2(50),
executionTime int,
method VARCHAR2(200)
)

 

 1.3.實體類
 
ide

public class SysLog {
    private String id;
    private Date visitTime;
    private String visitTimeStr;
    private String username;
    private String ip;
    private String url;
    private Long executionTime;
    private String method;

    //==============================================//
    public String getVisitTimeStr() {
        if(visitTime !=null){
            //調用本身寫的工具類轉換
            visitTimeStr = DateUtils.date2String(visitTime,"yyyy-MM-dd HH:mm:ss");
        }
        return visitTimeStr;
    }


    //=============================================//

  

 2.基於AOP日誌處理

   6.AOP日誌中信息獲取

6.AOP日誌中信息獲取

   7.AOP日誌查詢操做流程

7.AOP日誌查詢操做流程

  爲了獲取訪問的IP 

  在WEB-INF目錄下的

  web.xml 中配置一個spring監聽器Listener

    <!-- 配置監聽器,監聽request域對象的建立和銷燬的 -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

ip地址獲取
ip地址的獲取咱們能夠經過request.getRemoteAddr()方法獲取到。
Spring中能夠經過RequestContextListener來獲取requestsession對象。

 

   2.3.SysLogController

 

@RequestMapping("/sysLog")
@Controller
public class SysLogController {

    @Autowired
    private ISysLogService sysLogService;

    @RequestMapping("/findAll.do")
    public ModelAndView findAll() throws Exception{
        ModelAndView mv = new ModelAndView();
        List<SysLog> sysLogsList = sysLogService.findAll();
        mv.addObject("sysLogs",sysLogsList);
        mv.setViewName("syslog-list2");
        return mv;
    }
}

  

  2.4.Service層 
  

@Service
@Transactional
public class SysLogServiceImpl implements ISysLogService  {

    @Autowired
    private ISysLogDao sysLogDao;

    @Override
    public void save(SysLog log) throws Exception {
        sysLogDao.save(log);
    }

    @Override
    public List<SysLog> findAll() throws Exception {
        return sysLogDao.findAll();
    }
}

 

  2.5.Dao層  
  基於註解+接口的方法使用 mybatis集成spring  

public interface ISysLogDao {

    @Insert({"insert into SYSLOG(visitTime,username,ip,url,executionTime,method)" ,
             "values( #{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})" })
    public void save(SysLog log) throws Exception;  //保存日誌的接口方法


    @Select("select * from syslog")
    @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="visitTime",property="visitTime"),
            @Result(column="ip",property="ip"),
            @Result(column="url",property="url"),
            @Result(column="executionTime",property="executionTime"),
            @Result(column="method",property="method"),
            @Result(column="username",property="username")
    })
    public List<SysLog> findAll() throws Exception;  //查詢日誌的接口方法
    
}

 


 

  Controller層的AOP切面類 

  前置通知 的方法內容

@Component  //spring框架的註解
@Aspect
public class LogAop {

    @Autowired
    private HttpServletRequest request;  //訪問的IP

    @Autowired
    private ISysLogService sysLogService;

    private Date startTime;  //訪問開始時間
    private Class executionClass;  //訪問的類
    private Method executionMethod;  //訪問的方法


    //前置通知
    //主要是獲取開始時間,執行的類是哪個,執行的是哪個方法
    @Before("execution(* cn.bjut.ssm.controller.*.*(..))")
    public void doBefore(JoinPoint jp) throws NoSuchMethodException, SecurityException{
        //開始訪問的時間
        startTime = new Date();
        //具體要訪問的類
        executionClass = jp.getTarget().getClass();

        String methodName =jp.getSignature().getName();  //獲取訪問的方法的名稱
        Object[] args = jp.getArgs();  //獲取訪問的方法的參數

        //獲取具體執行的方法的Method對象
        if(args==null || args.length == 0){ //無參數
            executionMethod  = executionClass.getMethod(methodName);  //只能獲取無參數方法
        }else{
            // 有參數,就將args中全部元素遍歷,獲取對應的Class,裝入到一個Class[]
            Class[] classArgs = new Class[args.length];
            for(int i=0; i<args.length; i++) {
                classArgs[i] = args[i].getClass();
            }
            executionMethod = executionClass.getMethod(methodName, classArgs);// 獲取有參數方法
        }

    }

    //============================================================================================//

 

  後置通知 的方法內容

  

    //============================================================================================//


    //後置通知
    //主要獲取日誌中其它信息,時長、ip、url
    @After("execution(* cn.bjut.ssm.controller.*.*(..))")
    public void doAfter(JoinPoint jp) throws Exception {

        // 獲取類上的@RequestMapping對象
        if (executionClass != SysLogController.class) {
            RequestMapping classAnnotation = (RequestMapping) executionClass.getAnnotation(RequestMapping.class);
            if (classAnnotation != null) {
                // 獲取方法上的@RequestMapping對象
                RequestMapping methodAnnotation = executionMethod.getAnnotation(RequestMapping.class);

                if (methodAnnotation != null) {
                    String url = "";  // 它的值應該是類上的@RequestMapping的value+方法上的@RequestMapping的value
                    url = classAnnotation.value()[0] + methodAnnotation.value()[0];

                    SysLog sysLog = new SysLog();
                    // 獲取訪問時長
                    Long executionTime = new Date().getTime() - startTime.getTime();
                    // 將sysLog對象屬性封裝
                    sysLog.setExecutionTime(executionTime);
                    sysLog.setUrl(url);
                    // 獲取ip
                    String ip = request.getRemoteAddr();  //已經在web.xml配置spring的request監聽器
                    sysLog.setIp(ip);

                    // 能夠經過securityContext獲取,也能夠從request.getSession中獲取
                    SecurityContext context = SecurityContextHolder.getContext(); //request.getSession().getAttribute("SPRING_SECURITY_CONTEXT")
                    //String username = ((User) (context.getAuthentication().getPrincipal())).getUsername();
                    User user = (User) context.getAuthentication().getPrincipal();
                    String username = user.getUsername();

                    sysLog.setUsername(username);
                    sysLog.setMethod("[類名]" + executionClass.getName() + "[方法名]" + executionMethod.getName());
                    sysLog.setVisitTime(startTime);

                    // 調用Service,調用dao將sysLog insert數據庫
                    sysLogService.save(sysLog);

                }
            }
        }
    }

 

 

 

=====================

end

相關文章
相關標籤/搜索