aop應用.說實話,aop在spring應該算是個難點,它主是起到了"代理"的作 用,aop會爲你調用的方法的對象生成代理,這個代理是繼承調用
MethodInterceptor這個攔截器的對象的,所以,具備原有對象的所有方法與特性.AOP不神祕,它就是EJB的進化,只是EJB需要顯式的實現接
口,而AOP不用,它會自動幫你生成代理,來做很多事情,AOP,我覺得它在處理事務
的時候用的比較多所謂聲明式的事務就是由此而來.
public class AuthorityInterceptor implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation) throws Throwable
{
HttpServletRequest request = null;
ActionMapping mapping = null;
Object[] args = invocation.getArguments();
for (int i = 0 ; i < args.length ; i++ )
{
if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
}
Object admin = request.getSession().getAttribute("admin");
if ( admin != null && ((String)admin).equals("admin"))
{
return invocation.proceed();
}
else
{
request.setAttribute("msg" , "您還沒有登錄,請先登錄");
return mapping.findForward("admin");
}
}
}
該應用是在*.xml中來調用的..(用struts的mvc,然後託管給spring的ioc容器來管理的,配置也是由spring來處理的)
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/processAddStudent</value>
<value>/listStudent</value>
<value>/delStudent</value>
<value>/processAddTest</value>
<value>/addQuestion</value>
<value>/delQuestion</value>
<value>/processAddQuestion</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>authorityInterceptor</value>
</list>
</property>
</bean>
<bean id="authorityInterceptor" class="org.yeeku.action.authority.AuthorityInterceptor"/>
//解釋後的代碼
public class AuthorityInterceptor implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation) throws Throwable
{
HttpServletRequest request = null;
ActionMapping mapping = null;
-----------註解1開始
通過invocation.getArguments()可以獲取代理對象的參數
代理的參數是ActionMapping, ActionForm ,HttpServletRequest , HttpServletResponse 四個
只不過,這裏根據實際情況,我們只需要使用HttpServletRequest,ActionMapping罷了
因爲這裏你要通過request獲取session和通過mapping跳轉頁面
因爲 Object[] args = invocation.getArguments(); 規定,返回的必須是一個數組
所以,沒辦法,只能迭代把要用的找出來
而我們在XML配置的對象都是Struts Action
每一個Struts Action方法都形如這樣,
public ActionForward addBlog(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
所以,通過
for (int i = 0 ; i < args.length ; i++ )
{
if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args [i];
if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
}
可以從那裏迭代出來
你既然都有調用 Struts 了, mapping, form, request, response 肯定都已經注入了,咱們運行Struts, 是在 mapping, form, request,
response 都具備的情況下,使用的
所以, Object[] args = invocation.getArguments();
得到應該對象的所有參數是完全可以的
--------註解1結束
Object[] args = invocation.getArguments();
---------加這兩句是因爲要通過request獲取session 並且在判斷沒有權限的時候要通過mapping跳轉頁面
for (int i = 0 ; i < args.length ; i++ )
{
if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
}
Object admin = request.getSession().getAttribute("admin");
----------
如果權限有問題,
那麼invocation.procceed() 就不會執行,意味着你的那個 Action 對象**方法也不會執行, 但此時
mapping 是存在的, 來一下findForward("admin");
----------
if ( admin != null && ((String)admin).equals("admin"))
{
return invocation.proceed();
}
else
{
request.setAttribute("msg" , "您還沒有登錄,請先登錄");
return mapping.findForward("admin");
}
}
}