用戶登錄攔截器查詢到登錄用戶后如何將用戶信息傳遞到后面的Controller


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";
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM