1. 程式人生 > >struts2登入攔截(攔截Action,攔截url)

struts2登入攔截(攔截Action,攔截url)

1.攔截Action(通過struts2的攔截器interceptor)

在某些時候我們希望對某個動作進行攔截(比如在未登入的情況下不能進行資訊查詢動作),這時我們就要用到struts2的interceptor。

1.1 struts.xml配置

<package name="loginPackage" extends="struts-default">
    <!-- 定義攔截器  -->
    <interceptors>
        <interceptor name="queryInterceptor" class
="homework.chapter01.QueryInterceptor"/>
<!-- 定義攔截器棧 --> <interceptor-stack name="queryInterceptorStack"> <interceptor-ref name="queryInterceptor"/> <!-- 引用struts2中預設的攔截器棧 --> <interceptor-ref name="defaultStack"/> </interceptor-stack
>
</interceptors> <!-- 點選查詢時呼叫的action --> <action name="StudentAction" class="homework.chapter01.StudentAction"> <result name="success">/homework/chapter01/studentMessage.jsp</result> <result name="error" type="redirect">/homework/chapter01/error.jsp</result
>
<result name="login" type="redirect">/homework/chapter01/login.jsp</result> <!-- 設定action的攔截器 【訪問該action時啟用LoginInterceptor攔截器】--> <interceptor-ref name="queryInterceptorStack"/> </action> </package>

備註:在定義的攔截器棧中一定要引用struts2的預設攔截器。


1.2 Action的execute方法

public String execute() throws Exception
    {
        ActionContext context = ActionContext.getContext();

        //預設的登入名稱以及登入密碼
        String defaultName = "admin";
        String defaultPassword = "123456";


        if(defaultName.equals(user.getName())&&defaultPassword.equals(user.getPassword()))
        {
            context.getSession().put("userName", user.getName());//將使用者名稱存入session,供攔截器等使用
            return SUCCESS;
        }
        else
        {
            context.getSession().put("userName", null);
            context.put("errorMessage","使用者名稱或密碼錯誤!");//登入頁面提示資訊
            return "login";
        }

    }

備註:此處如果登入資訊正確則把使用者資訊放入session中。

攔截器QueryInterceptor

/**
 * 查詢資訊時用的登入攔截器
 */
public class QueryInterceptor extends AbstractInterceptor
{

    private static final long serialVersionUID = 1L;

    @Override
    public String intercept(ActionInvocation invocation) throws Exception
    {
        ActionContext context = invocation.getInvocationContext();

        String userName = (String)context.getSession().get("userName");

        if(userName!=null)
        {
            return invocation.invoke(); //繼續向下執行
        }
        else
        {
            context.put("errorMessage","您還未登入,請先登入!");

            return "login";
        }

    }

}

備註:struts2中的攔截器的執行順序是:攔截器1—攔截器n—請求的Action—攔截器n—攔截器1
invocation.invoke()方法就是向下執行攔截器或者Action



2.攔截url(通過過濾器)

在某些時候我們希望使用者在沒有登入時不允許他直接進入某些頁面(比如在未登入時不能進入詳情頁面),這時我們就要用到過濾器Filter。

2.1 web.xml配置

<!-- 登入過濾器LoginFilter【檢查是否登入,如果沒登入則重定向到login.jsp】 -->
  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>homework.chapter01.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <!-- 只過濾以jsp結尾的url -->
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>


  <!-- struts2預設過濾器 -->
  <filter>
    <filter-name>myStruts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>myStruts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

備註:此處在web.xml中加入了自定義的過濾器loginFilter,且該過濾器只過濾了jsp結尾的url。

2.2 過濾器LoginFilter

/**
 * 過濾器
 * 未登入訪問除login.jsp頁面進行過濾【重定向到login.jsp頁面】
 */
public class LoginFilter implements Filter
{
    private static String LOGIN_PAGE = "/homework/chapter01/login.jsp";

    @Override
    public void destroy()
    {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
    {
        HttpServletRequest req = (HttpServletRequest)request;  
        HttpServletResponse res = (HttpServletResponse)response;  

        String currentUrl = req.getServletPath();  

        HttpSession session = req.getSession();  

        System.out.println("登入過濾器LoginFilter【檢查是否登入,如果沒登入則重定向到login.jsp】");  

        if (currentUrl.equals(""))
        {
            currentUrl = currentUrl + "/";  
        }
        else if((currentUrl.startsWith("/")) && (!currentUrl.startsWith(LOGIN_PAGE))) //不是請求的login.jsp頁面
        {  
          String user = (String)session.getAttribute("userName");  
          if (user == null) 
          {  
            res.sendRedirect(req.getContextPath() + LOGIN_PAGE);

            return;  
          }
        }

        chain.doFilter(request, response);  
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException
    {

    }
}

備註:在訪問每個jsp頁面時都會經過改過濾器,如果是登入了則可繼續訪問,如果沒有登入則重定向到login.jsp頁面。

總結:
  攔截器Interceptor作用於action中,只有訪問相應的aciton時才會呼叫相應的攔截器。
  過濾器Filter作用於已配置的要過濾的url。(web.xml中配置)

相關推薦

struts2登入攔截攔截Action攔截url

1.攔截Action(通過struts2的攔截器interceptor) 在某些時候我們希望對某個動作進行攔截(比如在未登入的情況下不能進行資訊查詢動作),這時我們就要用到struts2的interceptor。 1.1 struts.xml配置

struts2 2.5動態Action struts.xml web.xml 配置

動態Action 要使用動態Action的時候,需要在struts.xml中加入 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 這句程式碼起到了說明動態Actio

初遇C#:一個簡單的小程序圓形周長面積計算器

編碼 雙精度 崩潰 輸入 面向對象 窗口 語句 readline 面向對象的語言 作為一個面向對象的語言,與用戶的交互很關鍵! 在此,我們可以先分析一下我們這個小程序要與用戶交互的內容:1.命名很重要,讓用戶看見這個程序就知道這個程序的作用。 2.當用戶打開這個程序時,提示

C語言高效編程的幾招絕對實用絕對經典

n) 工程 fine bit 高效 nbsp 與運算 測試的 body 編寫高效簡潔的C語言代碼,是許多軟件工程師追求的目標。廢話不說,走起! 第一招:以空間換時間 計算機程序中最大的矛盾是空間和時間的矛盾,那麽,從這個角度出發逆向思維來考慮程序的效率問題 eg.字

2017高德地圖API WEB開發key申請地圖搭建簡約教程

height 圖層 類型 開發文檔 doctype content 如何 加載 innerhtml 前端時間因為公司需要研究 了一下百度的教程 然後寫個簡約的筆記記錄一下自己學習的收獲,只為了滿足自己暫時的寫作熱情 高德地圖WEB開發(key申請、api)簡

qt自己定義搜索框超簡單帶效果圖

clu blog button jsb 搜索 代碼 source fix color 1. 什麽也不要說。先上效果圖: 2. 代碼 頭文件: #ifndef APPSEARCHLINE_H #define APPSEARCHLINE_H #inc

MD5加密32位大寫/小寫

bytes for oar ins 保密 num 多說 trace 哈希 不多說其他的,MD5加密用於一些數據的保密,列入:密碼等;在這所用的是MD5加密成32位。 32位:(第一種) public class MD5 { // 全局數組//大寫// priva

DCL權限 用戶

用戶 創建用戶 -1 dcl evo -- spa col upd 2017-07-18 14:20:12 -- 創建用戶create user [email protected]/* */%‘ IDENTIFIED by ‘1234‘; --

自定義監控網頁報警郵件報警

zabbix註:zabbix的安裝配置參考另一篇文章1.Zabbix客戶端配置[[email protected]/* */ ~]# cat /tmp/user.sh #!/bin/bashuptime |awk ‘{print $4}‘[[email protected]/* */

2.4 梯度下降算法非常重要重點理解

eve 最快 style 梯度下降 更新 叠代 img 平均值 圖片 已經知道了logistic回歸模型,也知道了損失函數 損失函數是衡量單一訓練樣例的效果,還知道了成本函數 成本函數用於衡量參數w和b的效果在全部訓練集上面的衡量下面開始討論如何使用梯度下降法來訓練或學習訓

2.2 logistic回歸損失函數非常重要深入理解

問題 好的 為知 得出 cnblogs 回歸算法 很多 將他 深入 上一節當中,為了能夠訓練logistic回歸模型的參數w和b,需要定義一個成本函數 使用logistic回歸訓練的成本函數 為了讓模型通過學習來調整參數,要給出一個含有m和訓練樣本的訓練集很自然的,希望通過

linux: cmake未完更新中

linux add ++ required version options tail rect exec 參考: http://blog.csdn.net/netnote/article/details/4051620 http://blog.csdn.net/fan_

例題6-4 破損的鍵盤又名:悲劇文本Broken KeyboardUVa 11988—靜態鏈表

else if strlen 靜態鏈表 尾插 指向 第一個元素 內容 其中 分享 問題描述: 你有一個破損的鍵盤。鍵盤上所有的鍵都可以正常工作,但有時候Home鍵或者End鍵會自動按下。你並不知道鍵盤存在這一問題,而是專心打稿子,甚至連顯示器都沒打開。當你打開

PHP 3DES 加解密CBC模式pkcs5padding填充

ner ech scm blog input 3des解密 tde 結合 rip 1、前言:項目中接入第三方支付遇到3DES加密,以前也沒用過,搜了好多,都不適用,各種不對,後來自己結合搜到的終於弄正確了,檢測地址:http://tool.chacuo.net/crypt3

解讀:未來30年新興科技趨勢報告AI FristIoT Second

體驗 數據分析 量子加密 除了 根據 dia 探測 clu 代碼 前段時間美國公布的一份長達35頁的《未來30年新興科技趨勢報告》。該報告是在美國過去五年內由政府機構、咨詢機構、智囊團、科研機構等發表的32份科技趨勢相關研究調查報告的基礎上提煉形成的。 通過對近70

Fast Arrangement 線段樹延遲標誌

down station its pan tick 完全 ket one ger 個人心得:線段樹的延遲標誌確實是減少了很多時間,思想比較簡單,但是實現得時候和建立延遲的時候比較麻煩。 按照我的一些理解,就是更新時找到完全覆蓋的區間時,更新延遲標誌,不再往下更新,但此時父節

POJ2096Collecting Bugs數學期望概率DP

like ini namespace reads cts require main pread 概率dp 問題: Ivan is fond of collecting. Unlike other people who collect post stamps, coins

《JavaWeb從入門到精通》明日科技清華大學出版社

order 清華大學 技術分享 ges 技術 -i 出版社 mage href 《JavaWeb從入門到精通》(明日科技,清華大學出版社)《JavaWeb從入門到精通》(明日科技,清華大學出版社)

APP端的網絡優化DNS優化HTTP優化

分開 也會 並且 頭像 尺寸 proto googl 運營 簡單 一、使用httpDNS優化DNS解析和緩存   一般來說在App內用域名發送請求都要經過DNS解析出ip,然後再根據ip去拿對應的資源,這個過程中,如果LocalDNS中存在這個域名對應的ip,就會直接返回這

三級菜單、購物車程序自寫待優化

pan 余額 設立 ike dig 查詢 lag pass 菜單 一、三級菜單程序: 要求: 1. 可依次進入各子菜單 2.可從任意一層往回退到上一層 3. 可從任意一層退出程序 各級菜單詳情見代碼: menu = { ‘北京‘:{ ‘海澱‘: