【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能

下单按钮功能

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第1张图片

订单确认页

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第2张图片

去订单确认页

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第3张图片
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第4张图片

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第5张图片

使用拦截器实现用户是否登录的校验

拦截器

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第6张图片
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第7张图片

配置拦截器

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第8张图片

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第9张图片

编写具体的业务逻辑

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第10张图片

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第11张图片

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第12张图片

点击提交订单事件

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第13张图片
表单数据:
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第14张图片

接收提交订单请求

在web.xml中添加service/*请求进入SpringMVC

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第15张图片

Controller

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第16张图片
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第17张图片

Service

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第18张图片
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第19张图片

在ApiService中扩展doPostJson方法

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第20张图片

测试

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第21张图片

通过token进行了2次查询

一次是在拦截器中查询,一次是在Controller查询,存在性能和资源浪费问题。

如何将拦截器中的数据传递到Controller?

方案:
1、 将User对象放置到request对象中
2、 使用ThreadLocal实现
a) 进入tomcat和产生响应前,都处于同一个线程中

实现:
1、 定义ThreadLocal
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第22张图片
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第23张图片

2、 在拦截器中将User对象放置到ThreadLocal中
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第24张图片
不过上面一开始把UserThreadLocal设置为空还是有问题,应该在afterCompletion之后设置为空:
这里写图片描述

package com.taotao.web.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
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.web.bean.User;
import com.taotao.web.service.UserService;
import com.taotao.web.threadlocal.UserThreadLocal;

public class UserLoginHandlerInterceptor implements HandlerInterceptor {

    public static final String COOKIE_NAME = "TT_TOKEN";

    @Autowired
    private UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        String loginUrl = this.userService.TAOTAO_SSO_URL + "/user/login.html";
        String token = CookieUtils.getCookieValue(request, COOKIE_NAME);
        if (StringUtils.isEmpty(token)) {
            // 未登录,跳转到登录页面
            response.sendRedirect(loginUrl);
            return false;
        }

        User user = this.userService.queryByToken(token);
        if (null == user) {
            // 登录超时,跳转到登录页面
            response.sendRedirect(loginUrl);
            return false;
        }

        // 登录成功

        UserThreadLocal.set(user); //将user对象放置到本地线程中,方便在Controller和Service中获取

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        UserThreadLocal.set(null); //清空本地线程中的User对象数据
    }

}

3、 在Service获取User对象
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第25张图片
Controller的获取就可以去掉了。
【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第26张图片

成功页

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第27张图片

使用joda-time组件:

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第28张图片

测试:

【SSM分布式架构电商项目-23】订单系统基于订单系统接口完成下单功能_第29张图片

你可能感兴趣的:(SSM分布式架构电商项目)