使用者登入攔截器查詢到登入使用者後如何將使用者資訊傳遞到後面的Controller
阿新 • • 發佈:2018-11-09
taotao建立訂單程式碼中之前忘了加入使用者資訊,那麼加上呢?
分析:使用者建立訂單的時候,我們會強制要求使用者先登入,也就是說,建立訂單的Controller執行時,一定是使用者已經登入了的,而使用者只要登入,就會在使用者登入攔截器中查詢到使用者資訊,而我們可以在攔截器中把使用者資訊放入request物件中,然後在後面的Controller中就可以在request中取到使用者資訊,再強轉成使用者物件即可。
使用者登入攔截器程式碼;
package com.taotao.portal.interceptor; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.taotao.common.utils.CookieUtils; import com.taotao.pojo.TbUser; importcom.taotao.portal.service.impl.UserServiceImpl; public class LoginInterceptor implements HandlerInterceptor { /** * 注意,因為攔截器屬於Controller,而在Controller中是不能使用Value註解來獲取配置檔案中設定的值的, * 因為 Value是spring父容器載入的屬性,而Controller是springMVC子容器載入的,子容器可以訪問父容器中的物件, * 但是不能訪問父容器中的屬性 * * 而我們在這裡還需要用到 配置檔案 中的 url值,只要用變通的方法 * 1.首先在service的實現類 UserServiceImpl 中用@Value獲取到屬性,並將其設定成 public型別 * 2.在Controller這裡,不注入介面,而是直接注入 UserServiceImpl 實現類 * 這樣就可以在Controller中直接使用注入的service實現類的屬性了*/ @Autowired private UserServiceImpl userService; //在handler執行之前處理 //返回值決定handler是否執行。true:執行, false:不執行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判斷使用者是否登入 //從cookie中取token String token = CookieUtils.getCookieValue(request, "TT_TOKEN"); //根據token換取使用者資訊,呼叫sso系統的介面 ///這裡需要寫一些業務 邏輯,不要在攔截器中寫,單寫一個service,只在這裡注入並呼叫 TbUser user = userService.getUserByToken(token); //如果取不到使用者資訊 if (user==null) { //跳轉到登入頁面,把使用者請求的url作為引數傳遞給登入頁面 response.sendRedirect(userService.SSO_BASE_URL+userService.SSO_PAGE_LOGIN +"?redirect="+request.getRequestURL()); //返回false return false; } //如果取到使用者資訊,放行 //把使用者資訊放到request中,以便後面在Controller中使用使用者資訊 request.setAttribute("user", user); //request中可以直接存物件,只要到了後臺都可以直接存物件 return true; } //在 handler執行之後,返回ModelAndView之前處理 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } //返回ModelAndView之後處理(響應使用者之後,可以用來處理異常) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }
然後在後面的Controller中就可以直接取到了:
Controller程式碼:
package com.taotao.portal.controller; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.taotao.common.pojo.CartItem; import com.taotao.common.utils.ExceptionUtil; import com.taotao.pojo.TbUser; import com.taotao.portal.pojo.Order; import com.taotao.portal.service.CartService; import com.taotao.portal.service.OrderService; /** * 訂單 * @author Administrator * order-cart * */ @Controller @RequestMapping("/order") public class OrderController { @Autowired private CartService cartService; @Autowired private OrderService orderService; //開啟訂單結算頁面 @RequestMapping("/order-cart") public String showOrderCart(HttpServletRequest request,HttpServletResponse response,Model model){ List<CartItem> cartItemList = cartService.getCartItemListSync(request, response); model.addAttribute("cartList", cartItemList); return "order-cart"; } @RequestMapping("/create") public String createOrder(Order order,Model model,HttpServletRequest request,HttpServletResponse response){ try { //從request中取使用者資訊 TbUser user = (TbUser) request.getAttribute("user"); //在order物件中補全使用者資訊 order.setUserId(user.getId()); order.setBuyerNick(user.getUsername()); //呼叫服務 String orderId = orderService.createOrder(order,request, response); model.addAttribute("orderId", orderId); model.addAttribute("payment", order.getPayment()); model.addAttribute("date", new DateTime().plusDays(3).toString("yyyy-MM-dd")); return "success"; } catch (Exception e) { e.printStackTrace(); model.addAttribute("message", "建立訂單出錯,請稍後再試"); return "error/exception"; } } }