中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣創建一個與Servlet-api完全解耦和的管理員后臺操作日志監控

發布時間:2021-12-21 10:20:07 來源:億速云 閱讀:141 作者:柒染 欄目:大數據

怎樣創建一個與Servlet-api完全解耦和的管理員后臺操作日志監控,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

在日常開發系統后臺時,需要針對管理員操作進行監控,如果使用Spring這一套技術體系,使用AOP切面編程+自定義注解不妨是一個好辦法,但是在使用這一套體系的同時也會出現一些坑。比如這一套體系是完全依賴于WEB環境,脫離WEB環境就會出現出現ServletRequestAttributes為null的情況。那么如何解決這個問題。

首先快速搭建一個Spring 的運行環境具體jar參照下圖:

<dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>servlet-api</artifactId>

      <version>2.5</version>

      <scope>provided</scope>

    </dependency>


    <!--jstl-->

    <dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>jstl</artifactId>

      <version>1.2</version>

    </dependency>


    <!--spring-->

    <!--spring相關依賴-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-core</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context-support</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-beans</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-aop</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-expression</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-aspects</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-tx</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-web</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>


    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-jdbc</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>


    <!--springmvc-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-webmvc</artifactId>

      <version>4.3.2.RELEASE</version>

    </dependency>


    <!--mybatis-->

    <dependency>

      <groupId>org.mybatis</groupId>

      <artifactId>mybatis</artifactId>

      <version>3.2.5</version>

    </dependency>


    <!--mybatis-spring-->


    <dependency>

      <groupId>org.mybatis</groupId>

      <artifactId>mybatis-spring</artifactId>

      <version>1.3.2</version>

    </dependency>


    <!--mysql-->

    <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId>

      <version>5.1.38</version>

    </dependency>


    <!--druid-->

    <dependency>

      <groupId>com.alibaba</groupId>

      <artifactId>druid</artifactId>

      <version>1.1.10</version>

    </dependency>

    <dependency>

      <groupId>com.alibaba</groupId>

      <artifactId>fastjson</artifactId>

      <version>1.2.47</version>

    </dependency>

    <!--commons-fileupload-->

    <dependency>

      <groupId>commons-fileupload</groupId>

      <artifactId>commons-fileupload</artifactId>

      <version>1.3</version>

    </dependency>


    <!--jackson-->

    <dependency>

      <groupId>com.fasterxml.jackson.core</groupId>

      <artifactId>jackson-databind</artifactId>

      <version>2.9.5</version>

    </dependency>


    <!--log4j-->

    <dependency>

      <groupId>log4j</groupId>

      <artifactId>log4j</artifactId>

      <version>1.2.16</version>

    </dependency>

    <!--junit測試-->

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.12</version>

      <scope>test</scope>

    </dependency>


首先對前面的開發步驟做一個簡單的講解,首先開發一個自定義注解:

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

//在方法上使用

@Target({ElementType.METHOD})

//類一旦運行  起作用

@Retention(RetentionPolicy.RUNTIME)

public @interface LogAnnotation {

public String value();

}

開發環繞通知(常規做法,下面做修改)

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpSession;

import java.lang.reflect.Method;

import java.util.Date;

/*

*

* 這是一個環繞通知

* 需要實現

* */

public class Around implements MethodInterceptor {

    @Override

    public Object invoke(MethodInvocation mi) throws Throwable {

        /*

        * 1.什么人--------

        * 2.什么時間 new Date()

        * 3.什么事情----方法名

        * 4.是否成功-----能

        * */

        ServletRequestAttributes s = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        //獲取HttpRequst對象,于Servlet強耦合

        HttpSession session = s.getRequest().getSession();

        //拿到存放在Session的數據

        String adminName = (String)session.getAttribute("admin");

        //時間

        Date date = new Date();

        //什么事情

        Method method = mi.getMethod();

        //拿到類對象  反射

        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);

        //通過反射拿到的實例  調用方法

        String name = annotation.value();

        //是否成功

        boolean flag = false;

        Object proceed = null;

        try {

            proceed = mi.proceed();

            flag=true;

        }catch (Exception a){

            a.printStackTrace();

        }

        //這里不做插入數據庫的操作

        System.out.println(adminName+"管理員在"+date+"執行了"+name+"成功了么?"+flag);

        return proceed;

    }

}


上述實現的修改(于Servlet弱耦合),利用Spring的DI特性,實現對操作對象的自動注入。

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

import java.lang.reflect.Method;

import java.util.Date;

/*

* 這是一個環繞通知

* 需要實現

* */

public class Around implements MethodInterceptor {

    //將操作對象聲明為成員變量

    private String adminName;

    //設置公開訪問方法,實現未來的數據注入

    public void setAdminName(String adminName) {

        this.adminName = adminName;

    }


    @Override

    public Object invoke(MethodInvocation mi) throws Throwable {

        Date date = new Date();

        //什么事情

        Method method = mi.getMethod();

        //拿到類對象  反射

        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);

        //通過反射拿到的實例  調用方法

        String name = annotation.value();

        //是否成功

        boolean flag = false;

        Object proceed = null;

        try {

            proceed = mi.proceed();

            flag=true;

        }catch (Exception a){

            a.printStackTrace();

        }

        System.out.println(adminName+"管理員在"+date+"執行了"+name+"成功了么?"+flag);

        return proceed;

    }

}

以上將操作數據設定為成員變量,未來我可以在controller層和業務層增加一個過濾器,實現對操作數據的注入。

3. 對通知類使用Spring進行管理

<!--配置組裝切面-->

    <aop:config proxy-target-class="true">

        <!--配置切入點-->

        <aop:pointcut id="pc" expression="@annotation(com.baizhi.aop.LogAnnotation)"/>

        <!--組裝切面-->

        <aop:advisor advice-ref="around" pointcut-ref="pc"/>

    </aop:config>

過濾器的開發

import com.baizhi.aop.Around;

import org.springframework.web.context.WebApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;


import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import java.io.IOException;


public class LogFilter implements Filter {

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {


    }


    @Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        filterChain.doFilter(servletRequest, servletResponse);

        HttpServletRequest res = (HttpServletRequest)servletRequest;

        HttpSession session = res.getSession();

        String admin = (String) session.getAttribute("admin");


        ServletContext servletContext = session.getServletContext();

        //使用這個web工具類拿到WebApplicationContext對象

        WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);

        //能通過WebApplicationContext類拿到已經初始化的Bean

        Around around = (Around) webApplicationContext.getBean("around");

        //通過set方法注入數據

        around.setAdminName(admin);

    }

    @Override

    public void destroy() {


    }

}

5.最后在web.xml中進行配置

 <!--配置過濾器位置-->

<filter>

  <filter-name>log</filter-name>

  <filter-class>com.baizhi.filter.LogFilter</filter-class>

</filter>

  <!--過濾器攔截位置-->

<filter-mapping>

  <filter-name>log</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

搞定測試,這樣做的好處是可以在測試某個模塊時,只關注于String類型的name就行了,不必去考慮web的session的獲取問題和null值問題

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安庆市| 永仁县| 霍州市| 岳阳市| 绥滨县| 象州县| 鹰潭市| 兴安盟| 陆丰市| 新绛县| 黄石市| 息烽县| 共和县| 葫芦岛市| 鄂托克前旗| 桓仁| 阳信县| 邹平县| 宁乡县| 石门县| 蓬溪县| 丹江口市| 大安市| 临沭县| 怀宁县| 洞口县| 安义县| 赞皇县| 宣汉县| 娄底市| 保德县| 巴中市| 清苑县| 陆川县| 阿巴嘎旗| 高邑县| 泰安市| 隆化县| 潜江市| 疏勒县| 介休市|