用户登录拦截器查询到登录用户后如何将用户信息传递到后面的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";
        }
    }
}

 

posted @ 2018-11-09 15:46  戈博折刀  阅读(2009)  评论(0编辑  收藏  举报