04.AdminLTE的基本介紹html
06.產品操做spring
07.訂單操做sql
08.權限控制數據庫
09.用戶和角色操做session
10.權限關聯mybatis
11.AOP日誌app
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; } //=============================================//
6.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來獲取request或session對象。
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