我是新來的軟。工程并為用戶管理和 Security 包內部做一個專案,我有一個名為SecurityAspectswhere I define @Pointcutand的類@Around。
我正在使用Apache Ant編譯整個程式。
安全方面.java
package teste.servicepack.security.logic;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import teste.domain.UserSession;
import teste.servicepack.security.SecurityContextProvider;
import teste.servicepack.security.logic.Exception.FailRoleException;
import teste.servicepack.security.logic.Exception.NotAuthenticatedException;
import teste.servicepack.security.logic.Permission.HasRole;
import teste.utils.HibernateUtils;
import java.util.Arrays;
import java.util.logging.Logger;
@Aspect
public class SecurityAspects {
private static final Logger logger = Logger.getLogger(String.valueOf(SecurityAspects.class));
@Pointcut("@annotation(Transaction)")
public void TransactionPointCut(){}
@Pointcut("@annotation(IsAuthenticated)")
public void isAuthenticatedPointCut(){}
@Pointcut("@annotation(hasRole)")
public void hasRolePointCut(HasRole hasRole){}
@Pointcut("execution(* *(..))")
public void executionPointCut(){}
//Transaction
@Around("TransactionPointCut() && executionPointCut()")
public Object transactionAdvise(ProceedingJoinPoint pjp) throws Throwable{
HibernateUtils.getCurrentSession().beginTransaction();
try {
Object obj = pjp.proceed();
HibernateUtils.getCurrentSession().getTransaction().commit();
logger.info("Transaction finished successfully!");
return obj;
}catch (Exception e){
HibernateUtils.getCurrentSession().getTransaction().rollback();
throw e;
}
}
// isAuthenticated
@Around("isAuthenticatedPointCut() && executionPointCut()")
public Object isAuthenticatedAdvise(ProceedingJoinPoint pjp) throws Throwable
{
logger.info("isAuthenticated");
String cookie = SecurityContextProvider.getInstance().getSecuritySessionContext().getRequester();
UserSession session = (UserSession) HibernateUtils.getCurrentSession().load(UserSession.class,cookie);
if(session.getUser() != null)
return pjp.proceed();
throw new NotAuthenticatedException("Access Denied, not authenticated at " pjp.getSourceLocation().getFileName() " " pjp.getSourceLocation().getLine() " service: " pjp.getSignature().getName());
}
// HasRole
@Around("hasRolePointCut(hasRole) && executionPointCut()")
public Object hasRoleAdvise(ProceedingJoinPoint pjp,HasRole hasRole) throws Throwable
{
logger.info("hasRole");
String cookie = SecurityContextProvider.getInstance().getSecuritySessionContext().getRequester();
UserSession session = (UserSession) HibernateUtils.getCurrentSession().load(UserSession.class,cookie);
String[] rolesIn = hasRole.role().split(",");
String[] roles = session.getUser().getRoles().split(",");
for(String checkRole: rolesIn){
if(Arrays.asList(roles).contains(checkRole)) {
return pjp.proceed();
}
}
throw new FailRoleException("Access Denied, does not have role " hasRole.role() " at " pjp.getSourceLocation().getFileName() " " pjp.getSourceLocation().getLine() " service: " pjp.getSignature().getName());
}
}
構建.xml
<?xml version="1.0"?>
<project default="deploy" basedir=".">
<property file="local.properties"/>
<property file="build.properties"/>
<path id="pathref">
<fileset dir="lib/hibernate">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/mysql">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/commons">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/log4j">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/json">
<include name="*.jar"/>
</fileset>
<fileset dir="${TOMCAT_HOME}/lib">
<include name="servlet-api.jar"/>
</fileset>
</path>
<taskdef name="hibernatetool"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="pathref" classpath="${build.dir.classes}"/>
<taskdef name="schemaupdate"
classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask"
classpathref="pathref" classpath="${build.dir.classes}"/>
<target name="generateUpdateHibernateSql" depends="compile">
<schemaupdate
properties="${build.dir.classes}/teste/domain/jdbc.properties"
quiet="no"
text="no">
<fileset dir="src/java">
<include name="**/*.hbm.xml"/>
</fileset>
</schemaupdate>
</target>
<target name="generateHibernateDomainObjects">
<mkdir dir="src/gen"/>
<replace dir="src/java" value="">
<include name="**/*.hbm.xml"/>
<replacefilter token='<timestamp source="db"' value="<timestamp"/>
</replace>
<hibernatetool>
<configuration>
<fileset dir="src/java">
<include name="**/*.hbm.xml"/>
</fileset>
</configuration>
<hbm2java
jdk5="true"
ejb3="false"
destdir="src/gen"/>
</hibernatetool>
<delete>
<fileset dir="src/gen">
<include name="**/*Impl.java"/>
</fileset>
</delete>
<replace dir="src/java" value="">
<include name="**/*.hbm.xml"/>
<replacefilter token='<timestamp' value='<timestamp source="db"'/>
</replace>
</target>
<target name="initDirs">
<mkdir dir="build"/>
<mkdir dir="build/ant"/>
<mkdir dir="build/ant/classes"/>
<mkdir dir="build/ant/war"/>
<mkdir dir="build/ant/war/WEB-INF"/>
<mkdir dir="build/ant/war/WEB-INF/classes"/>
<mkdir dir="build/ant/war/WEB-INF/lib"/>
</target>
<target name="deploy" depends="build.war">
<copy todir="${TOMCAT_HOME}/webapps/">
<fileset dir="build/ant/">
<include name="war/**/*.*"/>
</fileset>
</copy>
<touch file="${TOMCAT_HOME}/webapps/war/WEB-INF/web.xml"/>
</target>
<target name="build.war" depends="compile">
<copy todir="build/ant/war/WEB-INF" file="conf/web.xml"/>
<copy todir="build/ant/war">
<fileset dir="src/web">
<include name="**/*.*"/>
</fileset>
</copy>
<copy todir="build/ant/war/WEB-INF/classes">
<fileset dir="build/ant/classes">
<include name="**/*.*"/>
</fileset>
</copy>
<copy todir="build/ant/war/WEB-INF/lib">
<fileset dir="lib/hibernate">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/mysql">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/log4j">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/commons">
<include name="*.jar"/>
</fileset>
<fileset dir="lib/json">
<include name="*.jar"/>
</fileset>
</copy>
<touch file="build/ant/war/WEB-INF/web.xml"/>
</target>
<target name="war" depends="build.war">
<war file="build/ant/war.war">
<fileset dir="build/ant/war">
<include name="**/*.*"/>
</fileset>
</war>
</target>
<target name="compile" depends="initDirs">
<javac destdir="build/ant/classes"
debug="true"
encoding="UTF-8"
source="1.8" target="1.8"
classpathref="pathref">
<src path="src/java"/>
<src path="src/gen"/>
</javac>
<copy file="conf/log4j.properties" todir="build/ant/classes"/>
<copy file="conf/hibernate.cfg.xml" todir="build/ant/classes/teste/domain"/>
<copy todir="build/ant/classes">
<fileset dir="src/java">
<include name="**/*.xml"/>
</fileset>
</copy>
<copy file="conf/jdbc.properties" todir="${build.dir.classes}/teste/domain"/>
<replace file="${build.dir.classes}/teste/domain/jdbc.properties">
<replacefilter token="@database.username@" value="${database.username}"/>
<replacefilter token="@database.password@" value="${database.password}"/>
<replacefilter token="@database.connection.url@" value="${database.connection.url}"/>
</replace>
<replace file="${build.dir.classes}/teste/domain/hibernate.cfg.xml">
<replacefilter token="@database.username@" value="${database.username}"/>
<replacefilter token="@database.password@" value="${database.password}"/>
<replacefilter token="@database.connection.url@" value="${database.connection.url}"/>
<replacefilter token="@hibernate.show.sql@" value="${hibernate.show.sql}"/>
</replace>
</target>
</project>
但是我的問題是,當我嘗試用 Ant 編譯時,我遇到了這個錯誤:
/Users/dilantaskin/Downloads/TrabalhoES/src/java/teste/servicepack/security/logic/SecurityAspects.java:3: error: package org.aspectj.lang does not exist
/Users/dilantaskin/Downloads/TrabalhoES/src/java/teste/servicepack/security/logic/SecurityAspects.java:4: error: package org.aspectj.lang.annotation does not exist
就像我有超過 20 個錯誤只是因為org.aspectj.lang。
在 ide 中,一切看起來都很好,沒有什么像它不支持那樣保持紅色。
我可以看到我在外部庫中有aspectjrt.jar和aspectj-1.9.7 。
我試圖將 org.aspectj.lang 更改為org.aspectj.lang3但它無法識別。
誰能解釋我為什么即使我有必要的罐子也會出錯?
資訊:我沒有使用Maven,我認為(?)也沒有Spring。我有一個關于使用、和的基本Java專案。IntelliJTomcatHibernateServletAnt
由 kriegaex 編輯:作者在 GitHub 上的Edifie/user-management-NF下共享了一個MCVE,使問題可重現(如果首先您還下載并解壓縮 Tomcat,然后將 Ant 構建指向它)。
uj5u.com熱心網友回復:
我在 GitHub 上檢查了您的專案,感謝您的鏈接。它有很多錯誤,我幾乎不知道從哪里開始:
您提交了庫 JAR,而不是使用 Maven、Gradle 或者,如果您堅持使用 Ant,則使用 Ivy 之類的東西進行適當的依賴管理。依賴項應該在構建期間下載,而不是提交到源代碼管理 (SCM) 存盤庫中。使用 Maven 或 Gradle 的優勢還在于,像 IntelliJ IDEA 或 Eclipse 這樣的 IDE 可以自動匯入您的專案,并且還知道在哪里可以找到依賴項并在專案之間共享它們,而不是您將它們冗余地提交到每個專案 SCM 存盤庫并手動將它們添加到您的 IDE 專案配置中。那太丑了。
您專案中的 JAR 之一是
aspectj-1.9.6.jar. 這不是您想要的,而是一個可執行的安裝程式,其目的是在本地安裝 AspectJ。在那里,您還可以找到嵌套的 JAR,例如aspectjrt.jar(runtime)、aspectjtools.jar(compiler)、aspectjweaver.jar(load-time weaving agent)。您必須執行該安裝程式,然后將所需的庫復制到您的lib目錄。為了讓 Java 編譯器識別您的 AspectJ 匯入,您需要在您的類路徑上安裝 AspectJ 運行時,即您可以
aspectjrt-1.9.6.jar從 Maven Central 下載(在右上角的選單中選擇“下載 → jar”)。然后,您只需將其復制lib并添加到您的 Ant 腳本中:<fileset dir="lib"> <include name="aspectjrt*.jar"/> </fileset>現在專案編譯了,但如果能實作你想要的,取決于你是想使用 Spring AOP 還是原生 AspectJ。對于前者,不需要 AspectJ 編譯器,但您的方面必須是 Spring 組件。對于后者,編譯
javac是不夠的,還需要 AspectJ 編譯器ajc。AspectJ 為此提供了自己的Ant 任務。如果您需要 Ant 任務,您還希望在該任務的類路徑上擁有 AspectJ 編譯器(而不是在應用程式類路徑上,僅在構建期間)。那將是aspectjtools-1.9.6.jar。
我不是 Ant 用戶,所以我對這個古老的構建工具的興趣為零,但如果你是 Ant 用戶,你就會知道如何完成這項作業。
您的應用程式有更多錯誤,例如,就像我在評論中所說的那樣,如果您需要的話,應該使用完全限定的類名或匯入類并將注釋系結到切入點引數@annotation(Transaction)。@annotation(IsAuthenticated)
我認為,您應該休息一下,先學習一些 Ant 和 AspectJ 基礎知識,可能還要學習 Git 基礎知識。或者,如果您可以選擇從 Ant 切換到 Maven,我強烈建議您這樣做并忘記 Ant。如果您因為雇主要求您使用 Ant 而被 Ant 困住,我表示誠摯的慰問。但實際上,它只是一個工具,如果你需要它,只需學習如何處理它。??
PS:AspectJ 當前版本是 1.9.8。如果你喜歡,你可以升級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/430493.html
