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