struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
-
理解
Interceptor攔截器類似于我們學(xué)過的過濾器,是可以在action執(zhí)行前后執(zhí)行的代碼.是我們做web開發(fā)是經(jīng)常使用的技術(shù),比如權(quán)限控制,日志.我們也可以把多個(gè)interceptor連在一起組成一個(gè)棧.
攔截器是一種AOP(面向切面編程)思想的編程方式.它提供一種機(jī)制是開發(fā)者能夠把相對(duì)獨(dú)立的代碼抽離出來,配置到Action前后執(zhí)行.
Struts2攔截器,每個(gè)攔截器只有一個(gè)對(duì)象實(shí)例,屬于單例模式,struts2核心功能都是通過攔截器來實(shí)現(xiàn)的.
-
作用
對(duì)action的一些公共處理代碼可以放到攔截器中實(shí)現(xiàn),比如權(quán)限控制,日志.
-
執(zhí)行流程
? ? ? ? ? ? ? ? ??
?
-
實(shí)現(xiàn)步驟
下面寫一個(gè)自定義攔截器的例子,判斷用戶是否登錄,就是檢查當(dāng)前用戶的session中的user屬性是否為空,如果為空,就跳到登錄頁面,否則,繼續(xù)執(zhí)行.
1.編寫攔截器,在interceptor包下常見一個(gè)java類,名為L(zhǎng)oginInterceptor,繼承AbstractInterceptor:
public class LoginInterceptor extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation invocation) throws Exception {//得到攔截到的action的名稱,看是否是login,當(dāng)是login的時(shí)候,不用進(jìn)行下面的檢測(cè)了,直接執(zhí)行下一個(gè)攔截器String actionName=invocation.getProxy().getActionName();if("login".equals(actionName)){return invocation.invoke();}//如果不是login.則判斷是否已登錄,及檢測(cè)session中key為user的值是否存在,如果不存在,跳回到登錄頁面String user=(String)invocation.getInvocationContext().getSession().get("user");if(user==null){System.out.println("未登錄");return "login";}//進(jìn)行到這里.說明用戶已登錄,則跳轉(zhuǎn)到下一個(gè)攔截器return invocation.invoke();}}2,在struts.xml中配置interceptor,主要特別注意的是,當(dāng)使用了自定義的攔截器后,默認(rèn)攔截器將不起作用,默認(rèn)攔截器實(shí)在struts-default.xml中配置的,當(dāng)引用了自定義攔截器,又想使用struts2提供的默認(rèn)攔截器功能,需要手動(dòng)配置:這里我將默認(rèn)攔截器和我寫的進(jìn)行登錄權(quán)限驗(yàn)證的攔截器,寫到一個(gè)攔截器棧里,然后調(diào)用這個(gè)默認(rèn)攔截器棧:
<package name="default" namespace="/" extends="struts-default"><interceptors><!-- 配置自定義的攔截器--><interceptor name="checkLogin" class="com.wang.interceptor.LoginInterceptor"/><!--配置一個(gè)攔截器棧,里面包含自己定義的攔截器和defaultStack默認(rèn)攔截器--> <interceptor-stack name="myStack"><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="checkLogin"></interceptor-ref></interceptor-stack></interceptors><!--引用默認(rèn)的攔截器(棧)--><default-interceptor-ref name="myStack"></default-interceptor-ref><!--配置一個(gè)全局結(jié)果集-->
<global-results><result name="login">/login.jsp</result></global-results><action name="login" class="com.wang.action.LoginAction" ><result>/succ.jsp</result><result name="error">/login.jsp</result></action></package>
?
這里我使用了默認(rèn)攔截器標(biāo)簽,即相當(dāng)于在每個(gè)action標(biāo)簽下,使用了?<interceptor-ref name="myStack"></interceptor-ref>.jsp頁面和LoginAction類這里就省略了.
再來介紹一下方法攔截器,方法攔截器比action攔截器控制的更加精細(xì),大體實(shí)現(xiàn)方式和action攔截器相同,不同的是它繼承的是MethodFilterInterceptor類,重寫的是doInterceptor()方法,在struts.xml的配置上也有些不同,大體是這樣:
<interceptor-ref name="methodInterceptor"><!--配置被攔截的方法--><param name="includeMethods">methodA,methodsB</param> <!--配置不被攔截的方法--> <param name="excludeMethods">methodsC,methodsD</param></interceptor-ref>?
總結(jié)
以上是生活随笔為你收集整理的struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LintCode] strStr [K
- 下一篇: 之一:CABasicAnimation