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; import com.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"; } } }