使用struts2攔截功能進行登入攔截,整個過程主要依賴session中是否有用戶的信息;
如果沒有我們就進行攔截,然後自動跳轉到登入頁面。
1.首先,我們創建一個攔截類,並繼承AbstractInterceptor實現其方法intercept(ActionInvocation invocation);
public class FilterLogin extends AbstractInterceptor {
Logger logger = Logger.getLogger(this.getClass());
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) actionContext
.get(StrutsStatics.HTTP_REQUEST);
//獲取用戶session 用於判斷用戶是否登入
Map<String, Object> session = actionContext.getSession();
//首先判斷session,查找是否登錄成功,通過攔截器
if (session != null && session.get("username") != null) {
logger.info("通過攔截器,session中有記錄[" + session.get("username") + "]");
return invocation.invoke();
}
System.out.println("you no login ");
return "loginUI";
}
}
2.攔截類我們已經完成,下面就是登入頁面,這裏我們將登入頁面省略
3.配置struts.xml文件,在配置前,需要說一下,配置自定義攔截器需要繼承struts默認提供的defaultStack,這樣真正意義的攔截器才能生效
攔截器要放在<package>中
<!-- 自定義攔截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.mo.filter.FilterLogin" />
<interceptor-stack name="loginDefaultStack">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack" /> <!-- 一定要依賴struts2的攔截器 -->
</interceptor-stack>
</interceptors>
<!-- 自定義默認攔截器,包括struts2默認的攔截器 -->
<default-interceptor-ref name="loginDefaultStack" />
<!-- 全局 -->
<global-results>
<result name="loginUI" type="redirect">user_loginUI.action</result>
</global-results>
4.當然我們的登入頁面是不需要被攔截的,所以我們只需要讓登入部分繼承struts默認的攔截器就行了
<action name="user_*" class="userAction" method="{1}">
<!-- 登錄頁面不用攔截,直接繼承struts2默認的攔截器 -->
<interceptor-ref name="defaultStack" />
<result name="OK" type="redirectAction">music_show.action</result>
<result name="input">/jsp/login/login.jsp</result>
</action>
5.完成,,,,,,在這裏我們要注意一點,我們攔截的只是.action的請求,對應.jsp,我們可以將jsp文件全部放到/WEB-INF/目錄下,這樣客戶端就不能通過路徑訪問到jsp文件,只能通過.action跳轉訪問!