zoukankan      html  css  js  c++  java
  • 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的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";
            }
        }
    }
  • 相关阅读:
    数据存储检索之B+树和LSM-Tree
    Kylin构建Cube过程详解
    关于maven打包乱码报错问题解决
    很详尽KMP算法 转载
    计算机源码反码补码
    Lombok实现链式编程 转载
    java适配器模式
    ubuntu卸载软件步骤(转)
    JMeter压测的使用
    @valid注解的使用(转载)
  • 原文地址:https://www.cnblogs.com/libin6505/p/9935525.html
Copyright © 2011-2022 走看看