SSH框架網上商城項目第18戰之過濾器完成購物登錄功效的斷定。本站提示廣大學習愛好者:(SSH框架網上商城項目第18戰之過濾器完成購物登錄功效的斷定)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第18戰之過濾器完成購物登錄功效的斷定正文
上一節我們做完了購物車的根本操作,然則有個成績是:當用戶點擊結算時,我們應當做一個登錄的斷定,斷定用戶有無登錄,沒有登錄的話,得起首讓用戶登錄。這就用到了過濾器的技巧了,過濾器是專門攔阻頁面要求的,它與攔阻器的道理差不多,攔阻器是專門攔阻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 } }
從完成的代碼來看,重要腹瀉了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"; } } } }
我們看看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(); } }
好了,如許我們用過濾器完成了用戶登錄的斷定與跳轉,上岸事後,就可以跳轉到定單確認頁面了,後果以下:
全部流程測試終了,功效正常。其實這裡還可以再完美一點,我們其實應當在參加購物車之前就應當要停止登錄斷定,也就是說,購物車頁面的時刻曾經是登錄狀況了,這裡是定單確認頁面斷定登錄的。不外在購物車頁眼前停止斷定的話,我們就欠好用過濾器了,我們得用攔阻器,由於跳轉到購物車頁面要求的是Action,不是通俗頁面,要求Action的時刻我們得用攔阻器攔阻來斷定,前期再來完美這裡吧,如今先把這裡的功效根本完成了再說~好了,登錄斷定與跳轉就做好了。
原文地址:http://blog.csdn.net/eson_15/article/details/51425010
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。