16、threadlocal+攔截器

項羽齊發表於2018-03-26

 

1.2 獲取使用者資訊

1.2.1 問題分析

 

 

  1. 需要回去使用者資訊時需要首先獲取Request物件,如果沒有改物件則需要進行手動的傳參.這樣的程式碼耦合性太高.不建議使用

1.3 SpringMVC攔截器

1.3.1 ThreadLocal

說明:保證當前執行緒內實現資料的共享.線上程安全問題中經常使用

 

說明:通過ThreadLocal本地執行緒變數,可以實現當前執行緒的資料的共享.但是ThreadLocal中的存入資料使用set(). 獲取資料呼叫的get()..但是每次只能獲取單個資料.如果有多個資料進行存取,使用Map集合結構

 

1.3.2 ThreadLocal工具類

說明: package com.jt.web.util;

public class UserThreadLocal {
    
    //建立本地執行緒變數
    private static ThreadLocal<User> threadLocal = 
            new ThreadLocal<User>();
    
    public static User get(){
        
        return threadLocal.get();
    }
    
    public static void set(User user){
        
        threadLocal.set(user);
    }
}

 

 

1.3.3 攔截器實現

說明: package com.jt.web.intercept;

//定義SpringMVC的攔截器
public class WebInterceptor implements HandlerInterceptor{
    
    @Autowired
    private JedisCluster jedisCluster;
    private static ObjectMapper objectMapper = new ObjectMapper();
    
    //在執行請求之前執行 
    /**
     * 說明:如果使用者沒有登陸京淘系統,則應該在點選購物車按鈕時,訪問後臺
     * 資料前生效.
     * 思路:
     *     1.從request物件中獲取ticket資訊
     *  2.判斷ticket資訊中是否含有資料.
     *      如果有資料:
     *          從redis中獲取userJSON資料.
     *              如果資料不為null
     *                  獲取user資訊,之後儲存~~~~~~~
     *         除此之外 直接跳轉到登陸頁面
     * 
     *  3.引數解析
     *      return false; 表示攔截  不能訪問目標url
     *      return true ; 表示放行   可以訪問目標url
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        
        String ticket = CookieUtils.getCookieValue(request, "JT_TICKET");
        if(!StringUtils.isEmpty(ticket)){
            //表示資料不為null
            String userJSON = jedisCluster.get(ticket);
            
            if(!StringUtils.isEmpty(userJSON)){
                //redis中的資料不為null
                User user = 
                objectMapper.readValue(userJSON, User.class);
                
                //通過ThreadLocal實現資料傳輸
                UserThreadLocal.set(user);
                return true;    //表示放行
            }
        }
        
        //如果上述程式碼不能執行.則跳轉登入頁面
        response.sendRedirect("/user/login.html");
        return false;
    }
}

 

1.3.4 攔截器配置

 

<!--定義MVC的攔截器  -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--表示攔截的路徑  
                /* 攔截一級目錄 
                /** 攔截所有目錄
            -->
            <mvc:mapping path="/cart/**"/>
            <bean class="com.jt.web.intercept.WebInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

 

 

 

2.3 訂單提交

2.3.1 訂單的表設計

說明:訂單的整個的構成由3部分構成,分別是訂單表Order 訂單商品表 訂單物流表.

在三張表中

order  orderItem是一對多的對應關係

order  orderShipping 是一對一的對應關係

在維護時,通過order表來維護關聯關係

 

 

 

2.3.2 賦值分析

  1. el表示式遍歷

 

 

說明:上述的name寫法表示,為一個名為orderItemslist集合賦值.

其中${status.index}表示正在遍歷的下標

orderItems[${status.index}].itemId 表示

List<OrderItem物件> orderItems 中的OrderItem物件的itemId屬性賦值.

2.3.3 頁面分析

 

分析JS

 

2.3.4 編輯前端Controller

說明:包路徑package com.jt.web.controller; 

2.3.5 編輯前端Service 

2.3.6 介面檔案定義

請求方法

POST

URL

http://order.jt.com/order/create

返回值

orderId 訂單編號   使用String型別接收返回值

採用SysResult物件返回

2.3.7 定義後臺POJO物件

 













 

 

 

相關文章