javascript
使用AspectJ审计Spring MVC Webapp。 第1部分
如果您像我一樣,那么您將擁有那種編程天,一切似乎都進展順利。 您編寫代碼和測試,它就可以正常工作。 然后還有其他日子,非常糟糕的日子,在那兒,您知道所編寫的所有內容都盡可能正確,并且代碼拒絕運行:顯然有些錯誤,但是您不知道什么。 在為該博客編寫代碼時,我經歷了其中一種日子。 這個想法是為了演示如何使用Spring和Aspectj來審核用戶對屏幕的訪問。
審核面向用戶的屏幕訪問是面向方面編程(AOP)很好解決的少數交叉問題之一。 就我的演示代碼而言,其想法是,您將注釋添加到適當的控制器,并且每次用戶訪問頁面時,都會記錄該訪問。 使用此技術,您可以構建最流行的屏幕的圖片,從而構建應用程序中最流行的功能塊。 知道了這些細節之后,就可以更輕松地決定將開發目標放在何處,因為開發幾乎沒有人使用過的那些應用程序塊是沒有用的。
在下面的博客中,我之前已經討論過AspectJ和AOP,因為它們展示了基礎知識,但是很棒,但是它們并不是真正的Spring MVC應用程序。 我以前的博客是:
- AOP和AspectJ術語
- 定義Spring的AspectJ建議類型
- 在Spring應用程序中使用AspectJ的@After建議
- 使用Spring的AspectJ支持和@Before批注
- 在Spring應用程序中使用AspectJ的@AfterThrowing建議
這次我以為我會提出一個功能全面的Spring MVC應用程序,它使用了一個有用的AOP跨領域關注點。
對于演示代碼,我創建了一個簡單的Spring MVC應用程序,該應用程序具有兩個屏幕:主頁和幫助頁面。 在此之上,我創建了一個簡單的批注: @Audit ,用于將控制器標記為需要審計的控制器(并非所有控制器都需要,尤其是如果您選擇審計功能點而不是單個屏幕時),并且告訴建議對象的屏幕ID,如以下代碼段所示:
@Audit("Home") @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) {也就是說,直到一切都變成梨形...
攻擊的計劃是編寫我的簡單@Audit批注,并使用一個簡單的AuditAdvice類處理該批注,該類具有用Aspectj的@Before批注進行批注的方法。 然后,我假裝這是一個真正的建議類,這意味著將實際的審計委托給自動連接的AuditService對象。
我首先使用Spring項目模板創建一個示例Spring MVC應用程序:
然后,我將所有代碼放在一起,并希望它能正常工作,除非它不能工作:無論我嘗試了什么,Spring都不AuditService自動裝配到AuditAdvice類中。 這意味著當我的@Before注釋方法被調用時,它引發了NullPointerException
當您強烈懷疑自己的代碼正確并且無法正常工作時,需要調查的領域之一就是項目POM文件和設置。
事實是,當您使用別人的API,項目設置或其他工具時,您傾向于信任它的程度超過信任自己的代碼的程度。 我猜這是因為它通常是由一個非常受人尊敬的組織編寫的,這使您覺得他們有一些神奇的方式來編寫非常好的代碼,而且它通常包含一堆您沒有的東西真的很明白
由于API,工具,配置文件等都是由像您和我這樣的程序員編寫的,他們可能會犯與我們一樣多的錯誤,所以這確實是不合理的。
每當我登上飛機時,這個事實通常都會讓我感到擔心,因為您不想發生30,000英尺的軟件錯誤。
Spring MVC項目POM的問題在于,它已經過時并且充滿了標準的Spring MVC Java應用程序所不需要的東西,此外,沒有任何插件文檔的鏈接,因此請查找所有內容和不同的設置意味著什么很難。
前一段時間,我確實寫了一個名為Dissecting Spring的MVC Project POM的博客,試圖解釋Spring MVC模板應用程序POM的工作方式。
這些是我必須對標準Spring MVC模板POM文件進行的更改,才能使我的代碼正常工作。
這將創建創建以下版本屬性:
<org.springframework-version>3.2.3.RELEASE</org.springframework-version> <org.aspectj-version>1.7.1</org.aspectj-version>這不是Roo項目,我討厭不必要的配置。
這是引起所有問題的參考。 沒有它,將使用默認值,并且該應用程序將運行。
剩下下面的工作POM文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.captaindebug</groupId><artifactId>audit</artifactId><packaging>war</packaging><version>1.0.0-BUILD-SNAPSHOT</version><properties><java-version>1.7</java-version><org.springframework-version>3.2.3.RELEASE</org.springframework-version><org.aspectj-version>1.7.1</org.aspectj-version><org.slf4j-version>1.5.10</org.slf4j-version></properties><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework-version}</version><exclusions><!-- Exclude Commons Logging in favor of SLF4j --><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework-version}</version></dependency><!-- AspectJ --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>${org.aspectj-version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${org.aspectj-version}</version></dependency><!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${org.slf4j-version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.15</version><exclusions><exclusion><groupId>javax.mail</groupId><artifactId>mail</artifactId></exclusion><exclusion><groupId>javax.jms</groupId><artifactId>jms</artifactId></exclusion><exclusion><groupId>com.sun.jdmk</groupId><artifactId>jmxtools</artifactId></exclusion><exclusion><groupId>com.sun.jmx</groupId><artifactId>jmxri</artifactId></exclusion></exclusions><scope>runtime</scope></dependency><!-- @Inject --><dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version></dependency><!-- Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- Test --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java-version}</source><target>${java-version}</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><junitArtifactName>junit:junit</junitArtifactName></configuration></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>tomcat-maven-plugin</artifactId><version>1.1</version><configuration><server>myserver</server><url>http://localhost:8080/manager/text</url></configuration></plugin></plugins></build> </project>最后……正確設置了項目設置,接下來要做的是繼續執行代碼,這是我下次要介紹的內容。
有關此代碼和下一個博客的代碼,請訪問github: https : //github.com/roghughe/captaindebug/tree/master/audit-aspectj
翻譯自: https://www.javacodegeeks.com/2013/07/auditing-a-spring-mvc-webapp-with-aspectj-part-1.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的使用AspectJ审计Spring MVC Webapp。 第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 童子功是什么意思(练成“童子功”都有哪些
- 下一篇: 路路通电脑版(路路通软件)