下单按钮功能
订单确认页
去订单确认页
使用拦截器实现用户是否登录的校验
拦截器
配置拦截器
编写具体的业务逻辑
点击提交订单事件
表单数据:
接收提交订单请求
在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组件:
测试: