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

下单按钮功能

这里写图片描述

订单确认页

这里写图片描述

去订单确认页

这里写图片描述
这里写图片描述

这里写图片描述

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

拦截器

这里写图片描述
这里写图片描述

配置拦截器

这里写图片描述

这里写图片描述

编写具体的业务逻辑

这里写图片描述

这里写图片描述

这里写图片描述

点击提交订单事件

这里写图片描述
表单数据:
这里写图片描述

接收提交订单请求

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

这里写图片描述

Controller

这里写图片描述
这里写图片描述

Service

这里写图片描述
这里写图片描述

在ApiService中扩展doPostJson方法

这里写图片描述

测试

这里写图片描述

通过token进行了2次查询

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

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

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

实现:
1、 定义ThreadLocal
这里写图片描述
这里写图片描述

2、 在拦截器中将User对象放置到ThreadLocal中
这里写图片描述
不过上面一开始把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对象
这里写图片描述
Controller的获取就可以去掉了。
这里写图片描述

成功页

这里写图片描述

使用joda-time组件:

这里写图片描述

测试:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/cckevincyh/article/details/80279511