1. 程式人生 > >Spring Security應用開發(18)基於方法的授權(二)過濾

Spring Security應用開發(18)基於方法的授權(二)過濾

屬性 and welcome pre length ++ per tsa 目標

本文將介紹@PreFilter@PostFilter這兩個註解。

@PreFilter

@PreFilter用於對方法的參數進行過濾。這種情況下參數通常是集合類型,符合條件的值被保留在集合中,不符合條件的從集合中移除。如果有多個集合類型的參數,需要使用@PreFilter的一個屬性filterTarget來指定要過來的參數的名稱。

@PostFilter

@PostFilter用於對方法的結果進行過濾。這種情況下返回值通常是集合類型,符合條件的值被保留在集合中,不符合條件的從集合中移除。

@PreFilter註解的定義如下所示:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface PreFilter { public String value(); public String filterTarget() default ""; }

從上述定義可以看到,這些註解除了可以使用在方法上之外,還可以使用到類型上。

本文給出一個實例:

(1)編寫集合中的元素類型的定義。

/**
* @ClassName: UserBean
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年5月30日 下午9:12:46
*  
*/
public class UserBean {

public UserBean(String name, int salary) { super(); this.name = name; this.salary = salary; } private String name; private int salary;
public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSalary() { return salary; } public void setSalary(int
salary) { this.salary = salary; } @Override public String toString() { return "UserBean [name=" + name + ", salary=" + salary + "]"; } }

(2)定義待授權的類和方法。

定義該類和方法,並在該方法上定義@PreFilter@PostFilter註解。目標是先過濾參數salaryList,只保留其中salary>1000的元素,再過濾返回值,只保留其中name屬性的長度大於3的元素。

public class UserService {

@PreFilter( filterTarget="salaryList" , value="filterObject > 1000" )
@PostFilter( "filterObject.name.length()>3")
public List<UserBean>  getUsers(List<String> nameList,List<Integer> salaryList){

List<UserBean>  users = new ArrayList<UserBean>();
for(int i=0;i<nameList.size()&&i<salaryList.size();i++){
users.add(new UserBean(nameList.get(i),salaryList.get(i) ) );
}

return users;
}

}

(3)定義調用該方法的控制器方法。

@RequestMapping("/")
public ModelAndView  index(){
ModelAndView  mv = new ModelAndView();
mv.addObject("message", "Hello,welcome!");
mv.setViewName("home/index");
 

//準備了4個元素的集合。
List<String> nameList = new ArrayList<String>();
List<Integer> salaryList = new ArrayList<Integer>();

nameList.add("zhangsan");
nameList.add("lisi");
nameList.add("wangwu");
nameList.add("li");
 
salaryList.add(10);
salaryList.add(1001);
salaryList.add(2000);
salaryList.add(3000);
 
List<UserBean> users = this.userService.getUsers(nameList,salaryList);

//測試用途,僅僅輸出到控制臺。
System.out.println(users);

return mv;

}

(4)運行結果:

最後返回值的結果是3個元素的集合。

控制臺輸出如下:

[UserBean [name=zhangsan, salary=1001], UserBean [name=lisi, salary=2000], UserBean [name=wangwu, salary=3000]]

本文為了測試@PreFilter註解的filterTarget屬性的用法,被測試的方法使用了兩個參數。由於filterTarget屬性只能指定一個參數,同時同一個方法上只能定義唯一一個@PreFilter註解,因此getUsers()方法實際看到的參數中,nameList4個元素,salaryList3個元素,造成了錯位。實際應用時,可將nameListsalaryList合並為一個集合,這樣就能充分發揮@PreFilter的效果。

關於註解的可重復使用問題,請參考博客Java重要技術(17)註解之註解的重復使用

Spring Security應用開發(18)基於方法的授權(二)過濾