SpringMVC--攔截器(九)

一、攔截器

??Spring Web MVC 的處理器攔截器類(lèi)似于Servlet 開(kāi)發(fā)中的過(guò)濾器Filter,用于對(duì)處理器進(jìn)行預(yù)處理和后處理。

二、定義攔截器

實(shí)現(xiàn)HandlerInterceptor接口

public class LogInterceptor implements HandlerInterceptor{

    /**
     * controller執(zhí)行后且視圖返回后調(diào)用此方法
     * 這里可得到執(zhí)行controller時(shí)的異常信息
     * 這里可記錄操作日志爵赵,資源清理等
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
            throws Exception {
        
    }
    /**
     * controller執(zhí)行后但未返回視圖前調(diào)用此方法
     * 這里可在返回用戶(hù)前對(duì)模型數(shù)據(jù)進(jìn)行加工處理,比如這里加入公用信息以便頁(yè)面顯示
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
            throws Exception {
        
    }
    /**
     * controller執(zhí)行前調(diào)用此方法
     * 返回true表示繼續(xù)執(zhí)行慢蜓,返回false中止執(zhí)行
     * 這里可以加入登錄校驗(yàn)亚再、權(quán)限攔截等
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {  
        return false;
    }
}

三、攔截器配置

  1. 針對(duì)某種mapping配置攔截器
<bean
    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="logInterceptor" />
            </list>
        </property>
    </bean>
    <bean id="logInterceptor" class="com.neuedu.interceptor.LogInterceptor" />

  1. mapping配置全局?jǐn)r截器
<!--攔截器 -->
<mvc:interceptors>
    <!--多個(gè)攔截器,順序執(zhí)行 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.neuedu.interceptor.HandlerInterceptorLog"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.neuedu.interceptor.HandlerInterceptorLogin"></bean>
    </mvc:interceptor>
</mvc:interceptors>

  1. 日志攔截器
public class HandlerInterceptorLog implements HandlerInterceptor{
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("日志攔截器后……");
    }
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("控制器已執(zhí)行晨抡,但視圖未返回……");
    }
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object arg2) throws Exception {
        System.out.println("日志攔截器前……");
        return true;
    }
}
  1. 登錄攔截器

1) 用戶(hù)登陸 controller

// 登陸提交
// userid:用戶(hù)賬號(hào)氛悬,pwd:密碼
    @RequestMapping("/login")
    public String login(HttpSession session, String userid, String
            pwd) throws Exception {
// 向session記錄用戶(hù)身份信息
        session.setAttribute("activeUser", userid);
        return "redirect:order/itemsList";
    }
    // 退出
    @RequestMapping("/logout")
    public String logout(HttpSession session) throws Exception {
// session過(guò)期
        session.invalidate();
        return "redirect:login";
    }
  1. 攔截器
public class LoginInterceptor implements HandlerInterceptor{
//  進(jìn)入 Handler方法之前執(zhí)行
//  用于身份認(rèn)證则剃、身份授權(quán)
//  比如身份認(rèn)證,如果認(rèn)證通過(guò)表示當(dāng)前用戶(hù)沒(méi)有登陸如捅,需要此方法攔截不再向下執(zhí)行
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws
            Exception {
//  獲取請(qǐng)求的url
        String url = request.getRequestURI();
//  判斷url是否是公開(kāi) 地址(實(shí)際使用時(shí)將公開(kāi) 地址配置配置文件中)
//  這里公開(kāi)地址是登陸提交的地址
        if(url.indexOf("login")>=0){
//  如果進(jìn)行登陸提交棍现,放行
            return true;
        }
//  判斷session
        HttpSession session = request.getSession();
//  從session中取出用戶(hù)身份信息
        String username = (String)
                session.getAttribute("username");
        if(username != null){
//  身份存在,放行
            return true;
        }
//  執(zhí)行這里表示用戶(hù)身份需要認(rèn)證镜遣,跳轉(zhuǎn)登陸頁(yè)面
        request.getRequestDispatcher("/WEBINF/views/login.jsp").forward(request, response);
//  return false表示攔截己肮,不向下執(zhí)行
//  return true表示放行
        return false;
    }
//  進(jìn)入Handler方法之后,返回modelAndView之前執(zhí)行
//  應(yīng)用場(chǎng)景從modelAndView出發(fā):將公用的模型數(shù)據(jù)(比如菜單導(dǎo)航)在這里傳到
    視圖悲关,也可以在這里統(tǒng)一指定視圖
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("返回?cái)?shù)據(jù)……");
    }
    //  執(zhí)行Handler完成執(zhí)行此方法
    //  應(yīng)用場(chǎng)景:統(tǒng)一異常處理谎僻,統(tǒng)一日志處理
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception
                                        ex)
            throws Exception {
        System.out.println("日志統(tǒng)一處理");
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寓辱,隨后出現(xiàn)的幾起案子艘绍,更是在濱河造成了極大的恐慌,老刑警劉巖秫筏,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诱鞠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡这敬,警方通過(guò)查閱死者的電腦和手機(jī)航夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崔涂,“玉大人阳掐,你說(shuō)我怎么就攤上這事±渎欤” “怎么了锚烦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)帝雇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蛉拙,這世上最難降的妖魔是什么尸闸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮孕锄,結(jié)果婚禮上吮廉,老公的妹妹穿的比我還像新娘。我一直安慰自己畸肆,他們只是感情好宦芦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著轴脐,像睡著了一般调卑。 火紅的嫁衣襯著肌膚如雪抡砂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天恬涧,我揣著相機(jī)與錄音注益,去河邊找鬼。 笑死溯捆,一個(gè)胖子當(dāng)著我的面吹牛丑搔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播提揍,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啤月,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劳跃?” 一聲冷哼從身側(cè)響起谎仲,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎售碳,沒(méi)想到半個(gè)月后强重,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸人,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年间景,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺智。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倘要,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出十拣,到底是詐尸還是另有隱情封拧,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布夭问,位于F島的核電站泽西,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缰趋。R本人自食惡果不足惜捧杉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秘血。 院中可真熱鬧味抖,春花似錦、人聲如沸灰粮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粘舟。三九已至熔脂,卻和暖如春佩研,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锤悄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工韧骗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人零聚。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓袍暴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親隶症。 傳聞我的和親對(duì)象是個(gè)殘疾皇子政模,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 一、引言 本來(lái)想記錄一下關(guān)于用戶(hù)登陸和登陸之后的權(quán)限管理蚂会、菜單管理的問(wèn)題淋样,想到解決這個(gè)問(wèn)題用到Intercepto...
    青青子衿zq閱讀 1,540評(píng)論 1 1
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實(shí)現(xiàn)中胁住,有程序代碼之間控制趁猴,又名依賴(lài)注入。All 類(lèi)的創(chuàng)建彪见,...
    irckwk1閱讀 948評(píng)論 0 0
  • 16. Web MVC 框架 16.1 Spring Web MVC 框架介紹 Spring Web 模型-視圖-...
    此魚(yú)不得水閱讀 1,048評(píng)論 0 4
  • 對(duì)于java中的思考的方向儡司,1必須要看前端的頁(yè)面,對(duì)于前端的頁(yè)面基本的邏輯余指,如果能理解最好捕犬,不理解也要知道幾點(diǎn)。 ...
    神尤魯?shù)婪?/span>閱讀 819評(píng)論 0 0
  • Springmvc的處理器攔截器類(lèi)似于Servlet 開(kāi)發(fā)中的過(guò)濾器Filter酵镜,用于對(duì)處理器進(jìn)行預(yù)處理和后處理碉碉。...
    Cherry300閱讀 460評(píng)論 0 1