【SSH網上商城項目實戰18】過濾器實現購物登錄功能的判斷

        上一節我們做完了購物車的基本操作,但是有個問題是:當用戶點擊結算時,我們應該做一個登錄的判斷,判斷用戶有沒有登錄,沒有登錄的話,得首先讓用戶登錄。這就用到了過濾器的技術了,過濾器是專門攔截頁面請求的,它與攔截器的原理差不多,攔截器是專門攔截Action請求的,所以各有所用,如果直接是頁面的跳轉,不經過Action的話,我們只要寫一個攔截器即可,如果需要跳轉到一個Action處理,那麼我們就得寫一個攔截器。

1. 登錄跳轉的原理

        先說一下實現原理:寫一個過濾器,在web.xml中配置一下需要攔截的url,這樣的話,當用戶的請求url中滿足配置的話,就會執行我們自己寫的過濾器,在過濾器中,我們首先檢查session中有沒有登錄過的user,如果沒有說明沒有登錄,然後拿到用戶想要訪問的頁面url和參數,重新拼接成url放到session中,然後重定向到登陸頁面,登錄後跳轉到Action處理,處理完後跳轉到session中保存的url,即原來用戶想去的地方。這樣就完成了登陸的跳轉了。

2. 登錄跳轉的實現

        當現實購物車頁面後,我們點擊結賬,它會自動跳轉到訂單確認的頁面,如下:


        但是此時如果用戶沒登錄,我們肯定不能直接跳到訂單確認頁面,所以我們要用過濾器攔下來判斷一下,下面寫過濾器:

2.1 過濾器的實現

        過濾器的實現要實現Filter接口,並覆寫三個方法即可,其實我們主要要覆寫其中一個方法即可。如下:

  1. public class UserFilter implements Filter {  
  2.   
  3.     @Override  
  4.     public void destroy() {  
  5.         // TODO Auto-generated method stub  
  6.   
  7.     }  
  8.   
  9.     @Override  
  10.     public void doFilter(ServletRequest request, ServletResponse response,  
  11.             FilterChain chain) throws IOException, ServletException {  
  12.         HttpServletRequest req = (HttpServletRequest) request;  
  13.         HttpServletResponse res = (HttpServletResponse) response;  
  14.         // 判斷當前session是否有用戶信息  
  15.         if(req.getSession().getAttribute(“user”) == null) {  
  16.             //保存當前客戶想要去的url地址  
  17.             String goURL = req.getServletPath();//獲得用戶想要去的地址  
  18.             String param = req.getQueryString(); //獲得地址中攜帶的參數  
  19.             if(param != null) {  
  20.                 goURL = goURL + ”?” + param; //重新拼好請求地址+參數  
  21.             }  
  22.             //把當前客戶想要訪問的地址,存儲到session中  
  23.             req.getSession().setAttribute(”goURL”, goURL);  
  24.               
  25.             //非法請求,跳轉到登陸頁面  
  26.             req.getSession().setAttribute(”error”“非法請求,請登錄!”);  
  27.             res.sendRedirect(req.getContextPath() + ”/ulogin.jsp”);  
  28.         } else {  
  29.             //如果有下一個過濾器則跳轉,否則直接到目標頁面  
  30.             chain.doFilter(request, response);  
  31.         }  
  32.     }  
  33.   
  34.     @Override  
  35.     public void init(FilterConfig config) throws ServletException {  
  36.         // TODO Auto-generated method stub  
  37.   
  38.     }  
  39. }  
public class UserFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        // 判斷當前session是否有用戶信息
        if(req.getSession().getAttribute("user") == null) {
            //保存當前客戶想要去的url地址
            String goURL = req.getServletPath();//獲得用戶想要去的地址
            String param = req.getQueryString(); //獲得地址中攜帶的參數
            if(param != null) {
                goURL = goURL + "?" + param; //重新拼好請求地址+參數
            }
            //把當前客戶想要訪問的地址,存儲到session中
            req.getSession().setAttribute("goURL", goURL);

            //非法請求,跳轉到登陸頁面
            req.getSession().setAttribute("error", "非法請求,請登錄!");
            res.sendRedirect(req.getContextPath() + "/ulogin.jsp");
        } else {
            //如果有下一個過濾器則跳轉,否則直接到目標頁面
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        // TODO Auto-generated method stub

    }
}
        從實現的代碼來看,主要腹瀉了doFilter方法,在方法裏,首先判斷當前session中是否有用戶的信息,如果沒有,說明沒有登錄,那麼要先將用戶想要去的url地址和地址中的參數保存下來,拼成新的url存到session中,然後重定向到登陸頁面,讓用戶登陸。如果session中有用戶信息,說明已經登錄過了,直接放行到用戶想去的頁面。

        寫好了Filter,別忘了在web.xml中配置要過濾的url,配置如下:


        所以會過濾上面的${shop}/user/confirm.jsp。接下來我們看看登陸頁面,其實就是兩個框框,用戶名和密碼,主要看它跳到哪個Action去:


        我們看到,它跳轉到了userAction中的login方法去執行邏輯。下面我們實現userAction:

2.2 Action的實現

        在userAction中,我們首先進行登陸的判斷,即在數據庫中查找有沒有該用戶名和密碼的用戶,如果成功,則將user存到session中,然後返回一個結果,交給struts2處理,代碼如下:

  1. @Controller(“userAction”)  
  2. @Scope(“prototype”)  
  3. public class UserAction extends BaseAction<User> {  
  4.     public String login() {  
  5.         //進行登陸的判斷  
  6.         model = userService.login(model);  
  7.         if(model == null) {  
  8.             session.put(”error”“登陸失敗”);  
  9.             return “login”;  
  10.         } else {  
  11.             //登錄成功,先將用戶存儲到session中  
  12.             session.put(”user”, model);  
  13.             //根據session中goURL是否有值而決定頁面的跳轉  
  14.             if(session.get(“goURL”) == null) {  
  15.                 return “index”//跳到首頁  
  16.             } else {  
  17.                 return “goURL”;  
  18.             }  
  19.         }  
  20.     }  
  21. }  
@Controller("userAction")
@Scope("prototype")
public class UserAction extends BaseAction<User> {
    public String login() {
        //進行登陸的判斷
        model = userService.login(model);
        if(model == null) {
            session.put("error", "登陸失敗");
            return "login";
        } else {
            //登錄成功,先將用戶存儲到session中
            session.put("user", model);
            //根據session中goURL是否有值而決定頁面的跳轉
            if(session.get("goURL") == null) {
                return "index"; //跳到首頁
            } else {
                return "goURL";
            }
        }
    }
}
        我們看看struts.xml中的配置:

        因爲我們把goURL存在session中了,但是在struts.xml中我們不能像在Java代碼裏去拿session,然後拿參數,但是我們可以從值棧中取,上面是從值棧中取數據的方法。

2.3 Service層的登陸判斷

        Service層主要就是上面Action中用到的login方法,實現比較簡單,如下:

  1. //userService接口  
  2. public interface UserService extends BaseService<User> {  
  3.     //用戶登陸,成功返回該User  
  4.     public User login(User user);  
  5. }  
  6.   
  7. //userServiceImpl實現類  
  8. @Service(“userService”)  
  9. public class UserServiceImpl extends BaseServiceImpl<User> implements  
  10.         UserService {  
  11.   
  12.     @Override  
  13.     public User login(User user) {  
  14.         String hql = ”from User u where u.login=:login and u.pass=:pass”;  
  15.         return (User) getSession().createQuery(hql) //  
  16.             .setString(”login”, user.getLogin()) //  
  17.             .setString(”pass”, user.getPass()) //  
  18.             .uniqueResult();  
  19.     }  
  20.   
  21. }  
//userService接口
public interface UserService extends BaseService<User> {
    //用戶登陸,成功返回該User
    public User login(User user);
}

//userServiceImpl實現類
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements
        UserService {

    @Override
    public User login(User user) {
        String hql = "from User u where u.login=:login and u.pass=:pass";
        return (User) getSession().createQuery(hql) //
            .setString("login", user.getLogin()) //
            .setString("pass", user.getPass()) //
            .uniqueResult();
    }

}

        好了,這樣我們用過濾器實現了用戶登錄的判斷與跳轉,登陸過後,就能跳轉到訂單確認頁面了,效果如下:

        整個流程測試完畢,功能正常。其實這裏還可以再完善一點,我們其實應該在加入購物車之前就應該要進行登錄判斷,也就是說,購物車頁面的時候已經是登錄狀態了,這裏是訂單確認頁面判斷登錄的。不過在購物車頁面前進行判斷的話,我們就不好用過濾器了,我們得用攔截器,因爲跳轉到購物車頁面請求的是Action,不是普通頁面,請求Action的時候我們得用攔截器攔截來判斷,後期再來完善這裏吧,現在先把這裏的功能基本實現了再說~好了,登錄判斷與跳轉就做好了。


       相關閱讀:http://blog.csdn.net/column/details/str2hiberspring.html

       整個項目的源碼下載地址:http://blog.csdn.NET/eson_15/article/details/51479994

_____________________________________________________________________________________________________________________________________________________

—–樂於分享,共同進步!

—–更多文章請看:http://blog.csdn.net/eson_15


document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
    <div id="digg" articleid="51425010">
        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">

             <dt>頂</dt>
            <dd>5</dd>
        </dl>


        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">

              <dt>踩</dt>
            <dd>0</dd>               
        </dl>

    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
<script type="text/javascript">
            function btndigga() {
                $(".tracking-ad[data-mod='popu_222'] a").click();
            }
            function btnburya() {
                $(".tracking-ad[data-mod='popu_223'] a").click();
            }
        </script>

<div style="clear:both; height:10px;"></div>


    <div class="similar_article" style="">
            <h4>我的同類文章</h4>
            <div class="similar_c" style="margin:20px 0px 0px 0px">
                <div class="similar_c_t">
                            <label class="similar_cur">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('6228419','eson_15','foot','51425010');">●  項目實戰<em>(29)</em></span>
                            </label>
                            <label class="">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('6214186','eson_15','foot','51425010');">------【SSH網上商城】<em>(29)</em></span>
                            </label>
                </div>

                <div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
                    <a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
                    <ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51506334" id="foot_aritcle_51506334undefined9277752666439021" target="_blank" title="【SSH網上商城項目實戰29】使用JsChart技術在後臺顯示商品銷售報表">【SSH網上商城項目實戰29】使用JsChart技術在後臺顯示商品銷售報表</a><span>2016-05-26</span><label><i>閱讀</i><b>6059</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51484247" id="foot_aritcle_51484247undefined9945797520791491" target="_blank" title="【SSH網上商城項目實戰27】域名空間的申請和項目的部署及發佈">【SSH網上商城項目實戰27】域名空間的申請和項目的部署及發佈</a><span>2016-05-23</span><label><i>閱讀</i><b>13823</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475431" id="foot_aritcle_51475431undefined36056349337368454" target="_blank" title="【SSH網上商城項目實戰26】完成訂單支付後的短信發送功能">【SSH網上商城項目實戰26】完成訂單支付後的短信發送功能</a><span>2016-05-22</span><label><i>閱讀</i><b>4704</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51465067" id="foot_aritcle_51465067undefined14977679505574115" target="_blank" title="【SSH網上商城項目實戰24】Struts2中如何處理多個Model請求">【SSH網上商城項目實戰24】Struts2中如何處理多個Model請求</a><span>2016-05-21</span><label><i>閱讀</i><b>4245</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51452243" id="foot_aritcle_51452243undefined7588378365578563" target="_blank" title="【SSH網上商城項目實戰22】獲取銀行圖標以及支付頁面的顯示">【SSH網上商城項目實戰22】獲取銀行圖標以及支付頁面的顯示</a><span>2016-05-19</span><label><i>閱讀</i><b>3742</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51441431" id="foot_aritcle_51441431undefined7355249244558635" target="_blank" title="【SSH網上商城項目實戰20】在線支付平臺的介紹">【SSH網上商城項目實戰20】在線支付平臺的介紹</a><span>2016-05-18</span><label><i>閱讀</i><b>4107</b></label></li> </ul>

                    <ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51487323" id="foot_aritcle_51487323undefined39694351504000736" target="_blank" title="【SSH網上商城項目實戰28】使用Ajax技術局部更新商品數量和總價">【SSH網上商城項目實戰28】使用Ajax技術局部更新商品數量和總價</a><span>2016-05-24</span><label><i>閱讀</i><b>5337</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51479994" id="foot_aritcle_51479994undefined8860988306730673" target="_blank" title="【SSH網上商城項目實戰30】項目總結(附源碼下載地址)">【SSH網上商城項目實戰30】項目總結(附源碼下載地址)</a><span>2016-05-27</span><label><i>閱讀</i><b>21890</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475046" id="foot_aritcle_51475046undefined8361243723895866" target="_blank" title="【SSH網上商城項目實戰25】使用java email給用戶發送郵件">【SSH網上商城項目實戰25】使用java email給用戶發送郵件</a><span>2016-05-22</span><label><i>閱讀</i><b>4007</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51464415" id="foot_aritcle_51464415undefined9932068093562887" target="_blank" title="【SSH網上商城項目實戰23】完成在線支付功能">【SSH網上商城項目實戰23】完成在線支付功能</a><span>2016-05-20</span><label><i>閱讀</i><b>8822</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51447492" id="foot_aritcle_51447492undefined2283095778708184" target="_blank" title="【SSH網上商城項目實戰21】從Demo中看易寶支付的流程">【SSH網上商城項目實戰21】從Demo中看易寶支付的流程</a><span>2016-05-18</span><label><i>閱讀</i><b>9653</b></label></li> </ul>
                <a href="http://blog.csdn.net/eson_15/article/category/6228419" class="MoreArticle">更多文章</a></div>
            </div>
        </div>    
<script type="text/javascript">
    $(function () {
        GetCategoryArticles('6228419', 'eson_15','foot','51425010');
    });
</script>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章