轉自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html
為了說明此問題,我們建立struts2auth項目,流程圖如下:
簡短說明:當我們訪問main.jsp頁面,并試圖通過此頁面中的鏈接地址:note.action來訪問到.../WEB-INF/note.jsp頁面時,由于訪問的note.action配置了攔截器,所以會被攔截,如果攔截器判斷登錄則可以訪問,否則會跳到登錄頁面。如果我們從登錄頁面直接到main.jsp頁面,再來訪問note.action時,同樣被攔截但是由于登錄過,所以可以訪問到此action對應的內容。由這里的分析可以看出關鍵點就登錄成功時給出標志提供給攔截器判斷是否成功登錄。
步驟一,搭建好相關的開發環境,并準備好登錄頁面login.jsp,代碼如下:
<form action="<%=request.getContextPath()%>/login.action" method="post">
????????????? 姓名:<input type="text" name="username"><br>
????????????? 密碼:<input type="password" name="password"><br>
????????????? <input type="submit" value="登錄">
</form>
步驟二,建立相應的Action:LoginAction。代碼如下:
package com.asm;
public class LoginAction extends ActionSupport {
?????? private String username;
?????? Map session;
?????? public String execute() throws Exception {
????????????? if(username.equals("admin")){
???????????????????? session = ActionContext.getContext().getSession();
???????????????????? session.put("loginSign", "loginSuccess");
???????????????????? return SUCCESS;
????????????? }else{
???????????????????? return LOGIN;
????????????? }
}
...省略username的get/set方法
}
說明:我們這里是設定了只有登錄用戶名為admin時,此Action才設置登錄標志。另這里獲取Session對象采取的是“與Servlet解耦合的非IOC方式”。
步驟三,編寫攔截器類,代碼如下:
package com.asm.interceptor;
public class AuthInterceptor extends AbstractInterceptor {
?????? public String intercept(ActionInvocation invocation) throws Exception {
????????????? Map session = invocation.getInvocationContext().getSession();
????????????? // session=ActionContext.getContext().getSession();
????????????? if (session.get("loginSign") == null) {
???????????????????? return "login";
????????????? } else {
???????????????????? String result = invocation.invoke();
???????????????????? return result;
????????????? }
?????? }
}
步驟四,配置此Action相關,主要配置內容如下:
<struts>
?????? <package name="tokenTest" extends="struts-default">
????????????? <interceptors>
???????????????????? <interceptor name="auth"
??????????????????????????? class="com.asm.interceptor.AuthInterceptor">
???????????????????? </interceptor>
???????????????????? <interceptor-stack name="authStack">
??????????????????????????? <interceptor-ref name="auth"></interceptor-ref>
??????????????????????????? <interceptor-ref name="defaultStack"></interceptor-ref>
???????????????????? </interceptor-stack>
????????????? </interceptors>
????????????? <action name="login" class="com.asm.LoginAction">
???????????????????? <result name="success">/main.jsp</result>
???????????????????? <result name="login">/login.jsp</result>
????????????? </action>
?
????????????? <action name="note">
???????????????????? <result>/WEB-INF/note.jsp</result>
???????????????????? <result name="login">/login.jsp</result>
???????????????????? <interceptor-ref name="authStack"></interceptor-ref>
????????????? </action>
?????? </package>
</struts>
說明:結合前面的一些代碼來看,當我們為note.action配置了前面寫所的AuthInterceptor攔截器時,如果我們要訪問note.action,攔截器會首先判斷是否登錄,如果登錄則繼續把請求傳遞下去,如果沒有登錄則會返回到登錄頁面。
步驟五、編寫相關的其它jsp頁面,然后發布測試。此實例應重點是進一步掌握攔截器的配置使用。作為“實現資源權限訪問”,此實例不具參考價值。