struts2 自定義攔截器

一暑刃、為什么要自定義攔截器

在struts2里面有很多攔截器揽咕,這些攔截器是struts2封裝的功能乡恕,但是在實(shí)際開(kāi)發(fā)中,struts2里面攔截器中可能沒(méi)有要使用的功能尔觉,這個(gè)時(shí)候需要自己寫攔截器實(shí)現(xiàn)功能

二凉袱、攔截器的結(jié)構(gòu)

1、源代碼看攔截器結(jié)構(gòu)
  • 繼承類


    image.png

    image.png
  • 在接口里面有三個(gè)方法


    image.png

    image.png

    image.png
2侦铜、開(kāi)發(fā)中寫類专甩,繼承
  • 繼承MethodFilterInterceptor:它可以讓action里一些方法不進(jìn)行攔截
3、讓攔截器和action有關(guān)系
  • 不是action調(diào)用攔截器的方法钉稍,而是通過(guò)配置文件方式建立關(guān)系

三涤躲、自定義登錄攔截器

1、需求

在項(xiàng)目中贡未,有許多action的超鏈接种樱,實(shí)現(xiàn)只有是登錄的狀態(tài)蒙袍,才可以點(diǎn)擊action的超鏈接實(shí)現(xiàn)功能,如果不是登錄缸托,點(diǎn)擊action鏈接返回登錄頁(yè)面

2左敌、登錄狀態(tài):session域?qū)ο髮?shí)現(xiàn)
  • 登錄成功后,把數(shù)據(jù)放到session里面
  • 判斷session是否有值俐镐,可以知道登錄狀態(tài)
3矫限、實(shí)現(xiàn)登錄的基本功能

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <div align="center">
        <h1>Login</h1>
        <h3 style="color: red">${requestScope.msg }</h3>
        <form action="${pageContext.request.contextPath }/checklogin" method="post">
            username:<input type="text" name="username"/><br><br>
            passwork:<input type="password" name="password"/><br><br>
            <input type="submit" value="login"/>
        </form>
    </div>
  </body>
</html>

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    <c:if test="${''!=sessionScope.username && null!=sessionScope.username }">
        歡迎 ${sessionScope.username }
    </c:if>
    <c:if test="${''==sessionScope.username || null==sessionScope.username }">
        <a href="${pageContext.request.contextPath }/login.jsp"> 您好請(qǐng)登錄!</a>
    </c:if> 
    <br>
      <a href="${pageContext.request.contextPath }/hehe">點(diǎn)我·····</a>
    <br>
    <a href="${pageContext.request.contextPath }/haha">點(diǎn)我·····</a>
  </body>
</html>

CheckLogin.java

package work.zhangdoudou.Action;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import work.zhangdoudou.Bean.UserBean;

public class CheckLogin extends ActionSupport implements ModelDriven<UserBean>{
    private UserBean user;

    @Override
    public String execute() throws Exception {
        
        HttpServletRequest request=ServletActionContext.getRequest();
        if ("manman".equals(user.getUsername())&&"520".equals(user.getPassword())) {
            // 登錄成功
            //向session放值
            request.getSession().setAttribute("username", user.getUsername());
            System.out.println(SUCCESS);
            return SUCCESS;
        }else{
            //登錄失敗
            request.setAttribute("msg", "賬號(hào)或密碼錯(cuò)誤佩抹!");
            System.out.println(ERROR);
            return ERROR;
        }
    }
    
    @Override
    public UserBean getModel() {
        if (null==user) {
            user=new UserBean();
        }
        return user;
    }
}

struts.xml

<?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="false" value="struts.enable.DynamicMethodInvocation"/>
    <constant value="true" name="struts.devMode"/>
    <package name="default" extends="struts-default" namespace="/">
        <!--name:訪問(wèn)名稱 -->
        
        <action name="checklogin" method="execute" class="work.zhangdoudou.Action.CheckLogin">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
        
    </package>
</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>struts2.Filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>
4叼风、添加登陸攔截器

(1)判斷是否登錄:判斷session里面是否有username的值
(2)攔截器的實(shí)現(xiàn)過(guò)程

  • 創(chuàng)建一個(gè)類,繼承MethodFilterInterceptor類
  • 重寫MethodFilterInterceptor里的方法棍苹,寫攔截器邏輯

攔截器類Filter.java

package work.zhangdoudou.Filter;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.client.Invocation;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class Filter extends MethodFilterInterceptor{
    //這個(gè)方法里面寫攔截器邏輯
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {

        //判斷session是否有username值
        //得到session
        HttpServletRequest request=ServletActionContext.getRequest();
        Object object=request.getSession().getAttribute("username");
        //判斷
        if (null!=object) {
            //登陸狀態(tài)
            //做類似于放行操作
            return invocation.invoke();
        }else{
            //不是登陸狀態(tài)
            //不登錄不執(zhí)行action的方法无宿,返回登陸頁(yè)面
            request.setAttribute("msg", "請(qǐng)登錄!");
            return "error";
        }   
    }
}

(3)配置action和攔截器的關(guān)系(注冊(cè)攔截器)

  • 在要攔截的action標(biāo)簽所在的package標(biāo)簽里聲明攔截器
  • 在具體的action標(biāo)簽里使聲明的攔截器
  • struts2里面執(zhí)行很多默認(rèn)攔截器枢里,但是如果在action里面配置自定義攔截器
    問(wèn)題:默認(rèn)的攔截器不會(huì)執(zhí)行了
    解決:把默認(rèn)的手動(dòng)配置一次
    特點(diǎn):配置的攔截器會(huì)對(duì)action所有方法都會(huì)攔截
    struts.xml
<?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="false" value="struts.enable.DynamicMethodInvocation"/>
    <constant value="true" name="struts.devMode"/>
    <package name="default" extends="struts-default" namespace="/">
        
        <!-- 聲明攔截器 -->
        <interceptors>
            <interceptor name="login" class="work.zhangdoudou.Filter.Filter"></interceptor> 
        </interceptors>
    
    
        <!--name:訪問(wèn)名稱 -->
        <action name="checklogin" method="execute" class="work.zhangdoudou.Action.CheckLogin">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
        
        
        <action name="hehe" method="execute" class="work.zhangdoudou.Action.hehe">
            <!-- 使用自定義的攔截器 -->
            <interceptor-ref name="login"></interceptor-ref>
            <!-- 默認(rèn)攔截器手動(dòng)使用一次 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
        
    </package>
</struts>
5孽鸡、配置攔截器,不要對(duì)action的所有方法都進(jìn)行攔截
  • 直接通過(guò)配置方式讓action里面某些方法不進(jìn)行攔截
    struts.xml
<?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="false" value="struts.enable.DynamicMethodInvocation"/>
    <constant value="true" name="struts.devMode"/>
    <package name="default" extends="struts-default" namespace="/">
        
        <!-- 聲明攔截器 -->
        <interceptors>
            <interceptor name="login" class="work.zhangdoudou.Filter.Filter"></interceptor> 
        </interceptors>
    
    
        <!--name:訪問(wèn)名稱 -->
        <action name="checklogin" method="execute" class="work.zhangdoudou.Action.CheckLogin">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
        
        
        <action name="hehe" method="execute" class="work.zhangdoudou.Action.hehe">
            <!-- 使用自定義的攔截器 -->
            <interceptor-ref name="login"></interceptor-ref>
            <!-- 默認(rèn)攔截器手動(dòng)使用一次 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
        
        <action name="haha" method="haha" class="work.zhangdoudou.Action.hehe">
            <!-- 使用自定義的攔截器 -->
            <interceptor-ref name="login">
                <!-- 配置某些方法不進(jìn)行攔截 name屬性excludeMethods -->
                <param name="excludeMethods">haha</param>
            </interceptor-ref>
            <!-- 默認(rèn)攔截器手動(dòng)使用一次 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
        
    </package>
</struts>
6栏豺、實(shí)現(xiàn)效果

點(diǎn)擊攔截進(jìn)行登錄


image.png

image.png

點(diǎn)擊不攔截


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彬碱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奥洼,更是在濱河造成了極大的恐慌巷疼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵奖,死亡現(xiàn)場(chǎng)離奇詭異嚼沿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瓷患,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門骡尽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人擅编,你說(shuō)我怎么就攤上這事爆阶。” “怎么了沙咏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辨图,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肢藐,道長(zhǎng)故河,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任吆豹,我火速辦了婚禮鱼的,結(jié)果婚禮上理盆,老公的妹妹穿的比我還像新娘。我一直安慰自己凑阶,他們只是感情好猿规,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宙橱,像睡著了一般姨俩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上师郑,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天环葵,我揣著相機(jī)與錄音,去河邊找鬼宝冕。 笑死张遭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的地梨。 我是一名探鬼主播菊卷,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宝剖!你這毒婦竟也來(lái)了洁闰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诈闺,失蹤者是張志新(化名)和其女友劉穎渴庆,沒(méi)想到半個(gè)月后铃芦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體雅镊,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年刃滓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仁烹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咧虎,死狀恐怖卓缰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砰诵,我是刑警寧澤征唬,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站茁彭,受9級(jí)特大地震影響总寒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜理肺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一摄闸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦品洛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裙盾。三九已至番官,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背山孔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工蓉媳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留减宣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盟广,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 題目:使用struts2自定義攔截器,完成用戶登陸才能訪問(wèn)權(quán)限的實(shí)現(xiàn) 在session中存放user變量表示用戶登...
    rainumdo閱讀 331評(píng)論 0 1
  • 概述 本文簡(jiǎn)單介紹如何自定義一個(gè)Struts攔截器一姿,但不涉及攔截器基礎(chǔ)、原理等其他知識(shí),僅僅只是介紹自定義攔截器的...
    小山雀閱讀 190評(píng)論 0 0
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品,是在 struts1和WebWork的...
    inke閱讀 2,247評(píng)論 0 50
  • Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。Java 技術(shù)具有卓越的通用性昧穿、高效性时鸵、平臺(tái)移植性和...
    Java小辰閱讀 1,077評(píng)論 0 14
  • 【Day3】今日閱讀《世界上最神奇的秘密》,P1709--P2650厅瞎; 1.主要內(nèi)容: 《世界上最神奇的秘密》一書(shū)...
    巧兒踐行者閱讀 215評(píng)論 6 3