gpt4 book ai didi

java - Spring AOP : Accessing return value of advice

转载 作者:行者123 更新时间:2023-11-30 03:57:53 28 4
gpt4 key购买 nike

我想增加我对 AOP 的了解,但目前还不是很好。我有以下程序。主要是,我正在创建一些 User 对象并打印出他们的用户名。就在创建用户之前,我有一个安全方面,如果发现危险单词(检查 SQL 注入(inject)),它会运行并打印出错误。它可以工作,但它总是创建用户并打印出用户名,即使安全性发现错误也是如此。

安全检查返回一个 boolean 值。是否可以仅在检查返回 true 时运行其余部分?为此,我需要访问建议的返回值。还是需要更多的AOP和after-return来完成?如果是这样,有人可以解释一下吗?我目前只知道如何使用 before 和 after。

感谢您的帮助。下面是我的代码:

public class App 
{
public static void main( String[] args ){

ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
List<String> names = new ArrayList<String>();
List<User> users = new ArrayList<User>();

names.add("Chris");
names.add("Dave");
names.add(";DROP table");
names.add("Bob");

User user = null;
for(String name : names){
user = context.getBean("user", User.class);
user.setUsername(name);
users.add(user);
}
for(User u : users){
System.out.println(u.getUsername());
}
}
}

这是安全性:

public class Security {

private List<String> words = new ArrayList<String>();

{
words.add("drop");
words.add("delete");
words.add("truncate");
words.add("remove");
}

public boolean check(String input){
for(String word: words){
if(input.toLowerCase().contains(word)){
System.err.println("Unsafe word " + word + " found!!!!!");
return false;
}
}
return true;
}
}

这是我在 context.xml 中的内容

<bean id="user" class="com.company.springAOPExample.User" scope="prototype" />
<bean id="security" class="com.company.springAOPExample.Security" />

<aop:config>
<aop:aspect ref="security">
<aop:pointcut id="setUsername" expression="execution(* com.company.springAOPExample.User.setUsername(java.lang.String)) and args(username)" />
<aop:before pointcut-ref="setUsername" method="check" arg-names="username" />
</aop:aspect>
</aop:config>

最佳答案

首先我认为你必须在users.add(user);而不是user.setUsername(name);上添加AOP,然后您需要使用“周围建议”并在 true 的情况下调用继续,或者在 false 的情况下不调用它,如下所示:

public class Security {

private List<String> words = new ArrayList<String>();

{
words.add("drop");
words.add("delete");
words.add("truncate");
words.add("remove");
}

public Void check(User user, ProceedingJoinPoint pjp){
for(String word: words){
if(!user.getUsername().toLowerCase().contains(word)){
return pjp.proceed();
}
return;
}

}
}

关于java - Spring AOP : Accessing return value of advice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22660260/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com