- 一點廢話
- 檢查登入的攔截器案例
- 需求
- 如何實作呢
- 實作步驟
- 普通類MyIntercepter java 自定義攔截器
- 在strutsxml中配置攔截器
- JSP頁面
- 運作結果
- 提出新的問題
一點廢話
在上篇文章中我們已經說了如何自定義攔截器。
那麼我們就可以使用自定義攔截器來實作日常我們經常遇到的小功能。
例如:
在慕課網 我們找到視訊要點選開始學習時,會彈出登入的頁面。
在京東網上買商品時,點選結算也會彈出登入的頁面
在這裡使用我們的自定義攔截器就能夠實作這個功能。
檢查登入的攔截器案例
需求
首先說說我們的需求:
1.假設我們共三個頁面,登入頁面,首頁,其它頁面
2.當我們通路首頁,或者其它頁面時檢測使用者是否登入
3.如果未登入,跳轉到登入頁面
4.如果已經登入,就可以通路首頁和其它頁面。
如何實作呢?
我們都知道使用者每次通路伺服器都會執行個體化一個session對象,我們可以在使用者成功登入後把使用者的帳号儲存在session對象中。然後在攔截器中檢測session對象是否存在,以此來檢測使用者是否登入。
實作步驟
- 建立一個普通類,繼承AbstractInterceptor,實作抽象方法intercept
- 在struts.xml中配置攔截器
- 聲明攔截器
- 使用攔截器
普通類MyIntercepter .java 自定義攔截器
根據session對象裡面的username屬性來判斷使用者是否登入來執行不同的操作。當使用者未登入 傳回input視圖。如果登入,放行Action動作
public class LoginIntercepter extends AbstractInterceptor
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//擷取session對象
HttpSession session=ServletActionContext.getRequest().getSession();
//從session對象中獲得username
String username=(String) session.getAttribute("username");
/*
* 判斷username是否為空(使用者是否登入)
* 使用者未登入 傳回input視圖
* 使用者登入 放行action
*/
if(StringUtils.isEmpty(username)){
return "input";
}
String res=invocation.invoke();
return
在struts.xml中配置攔截器
struts.xml 在這個配置檔案裡,配置了一個struts2架構預定義的攔截器,名稱為LoginIntercepter。然後就是根據需求來判斷LoginIntercepter攔截器需要和那些Action動作裝配。
我們首先分析一下
- 未登入通路首頁 傳回登入頁面
- 未登入通路其它頁面 傳回登入頁面
-
未登入通路登入頁面呢?
仔細分析就能看出 未登入通路登入頁面肯定是可以通過的。否則就陷入死循環了 永遠登入不上。
然後就是為通路首頁和通路其它頁面的action裝配攔截器了。
而為了代碼的簡潔性,我們可以把input視圖設定為全局邏輯結果視圖。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 開發者模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="user" extends="struts-default" namespace="/user">
<!-- 聲明自己定義的攔截器,名字以及對應的java類 -->
<interceptors>
<interceptor name="myIntercepter" class="com.scx.web.intercepter.LoginIntercepter"></interceptor>
</interceptors>
<!-- 全局邏輯結果視圖 -->
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<!-- 使用者登入的操作方法 -->
<action name="login" class="com.scx.web.action.UserAction" method="login">
<result name="success" type="redirectAction">toMain</result>
</action>
<!-- 顯示首頁的操作方法 -->
<action name="toMain" class="com.scx.web.action.UserAction" method="main">
<interceptor-ref name="myIntercepter"></interceptor-ref>
<result name="success">/main.jsp</result>
</action>
<!-- 顯示另一個頁面的操作方法 -->
<action name="toOther" class="com.scx.web.action.UserAction" method="other">
<interceptor-ref name="myIntercepter"></interceptor-ref>
<result name="success">/other.jsp</result>
</action>
</package>
</struts>
JSP頁面
login.jsp 登入頁面 。如圖所示 很簡單。就不再說了
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>驗證登入的攔截器案例</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
使用者名:<input type="text" name="username"/><br/>
密碼:<input type="password" name="password"/><br/>
<input type="submit" value="login"/>
</form>
<hr>
<a href="${pageContext.request.contextPath}/user/toMain.action"> 前往首頁</a>
<a href="${pageContext.request.contextPath}/user/toOther.action"> 前往其它頁面</a>
</body>
</html>
main.jsp和other.jsp 僅僅為了測試。