cgb2008-京淘day19

閃耀太陽發表於2020-12-17

1. 京淘購物車業務實現

1.1 實現購物車刪除操作

1.1.1 業務分析

需求: 當使用者點選頁面刪除按鈕時,應該刪除後端資料庫記錄,同時應該重定向到購物車列表頁面.
在這裡插入圖片描述

1.1.2 編輯CartController

 /**
     * 完成購物車刪除操作
     * 1.url地址: http://www.jt.com/cart/delete/562379.html
     * 2.請求引數: 562379 itemId /userId
     * 3.返回值結果: 重定向到系統首頁
     */
    @RequestMapping("/delete/{itemId}")
    public String deleteCarts(Cart cart){

        long userId = 7L;
        cart.setUserId(userId);
        cartService.deleteCarts(cart);
        return "redirect:/cart/show.html";
    }

1.1.3 編輯CartService

@Override
    public void deleteCarts(Cart cart) {

        cartMapper.delete(new QueryWrapper<>(cart));
    }

1.2 購物車許可權控制

1.2.1 需求說明

當使用者在沒有登入的條件下不允許訪問敏感業務. 購物車操作/訂單操作等. 如何實現???
答:使用攔截器的機制

在這裡插入圖片描述

1.2.2 編輯配置類

在這裡插入圖片描述

1.2.3 編輯攔截器

package com.jt.interceptor;

import com.jt.util.CookieUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import redis.clients.jedis.JedisCluster;

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

@Component  //將攔截器交給spring容器管理
public class UserInterceptor implements HandlerInterceptor {

    private static final String JT_TICKET="JT_TICKET";

    @Autowired
    private JedisCluster jedisCluster;

    /**
     * 返回值說明:
     *      1.false  表示攔截  一般都要配合重定向的方式使用.
     *      2.true   表示放行
     *
     * 如何實現業務:
     *      判斷使用者是否登入:   Cookie資料  檢查redis中的資料.
     *      重定向到系統登入頁面.
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.校驗Cookie中是否有結果
        Cookie cookie = CookieUtil.getCookie(request, JT_TICKET);

        //2.校驗Cookie是否有效
        if(cookie != null){
            String ticket = cookie.getValue();
            if(StringUtils.hasLength(ticket)){
                //執行後續任務  校驗redis中是否有結果
                if(jedisCluster.exists(ticket)){
                    //表示使用者登入過  直接返回true
                    return true;
                }
            }
            //沒有結果,則cookie資料有誤,應該刪除
            CookieUtil.addCookie(response, JT_TICKET, "", "/", "jt.com", 0);
        }

        //3.如果資料為空,則重定向到系統首頁
        response.sendRedirect("/user/login.html");
        return false;   //表示攔截....
    }
}

相關文章