上一節我們做完了購物車的基本操作,但是有個問題是:當用戶點擊結算時,我們應該做一個登錄的判斷,判斷用戶有沒有登錄,沒有登錄的話,得首先讓用戶登錄。這就用到了過濾器的技術了,過濾器是專門攔截頁面請求的,它與攔截器的原理差不多,攔截器是專門攔截Action請求的,所以各有所用,如果直接是頁面的跳轉,不經過Action的話,我們只要寫一個攔截器即可,如果需要跳轉到一個Action處理,那麼我們就得寫一個攔截器。
1. 登錄跳轉的原理
先說一下實現原理:寫一個過濾器,在web.xml中配置一下需要攔截的url,這樣的話,當用戶的請求url中滿足配置的話,就會執行我們自己寫的過濾器,在過濾器中,我們首先檢查session中有沒有登錄過的user,如果沒有說明沒有登錄,然後拿到用戶想要訪問的頁面url和參數,重新拼接成url放到session中,然後重定向到登陸頁面,登錄後跳轉到Action處理,處理完後跳轉到session中保存的url,即原來用戶想去的地方。這樣就完成了登陸的跳轉了。
2. 登錄跳轉的實現
當現實購物車頁面後,我們點擊結賬,它會自動跳轉到訂單確認的頁面,如下:
但是此時如果用戶沒登錄,我們肯定不能直接跳到訂單確認頁面,所以我們要用過濾器攔下來判斷一下,下面寫過濾器:
2.1 過濾器的實現
過濾器的實現要實現Filter接口,並覆寫三個方法即可,其實我們主要要覆寫其中一個方法即可。如下:
- 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
- }
- }
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處理,代碼如下:
- @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”;
- }
- }
- }
- }
@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方法,實現比較簡單,如下:
- //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();
- }
- }
//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
_____________________________________________________________________________________________________________________________________________________
—–樂於分享,共同進步!
<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"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </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>