토큰 받아오는 코드 토큰은
package com.shop.cafe.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class OpenCrypt {
public static void main(String[] args) {
getSHA256("a","");
getSHA256("b","");
getSHA256("a","");
getSHA256("a","salt");
}
public static byte[] getSHA256(String source, String salt) {
byte byteData[]=null;
try{
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(source.getBytes());
md.update(salt.getBytes());
byteData= md.digest();
System.out.println("원문: "+source+ " SHA-256: "+
byteData.length+","+byteArrayToHex(byteData));
}catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
return byteData;
}
public static byte[] generateKey(String algorithm,int keySize) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
keyGenerator.init(keySize);
SecretKey key = keyGenerator.generateKey();
return key.getEncoded();
}
public static String aesEncrypt(String msg, byte[] key) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String iv = "AAAAAAAAAAAAAAAA";
cipher.init(Cipher.ENCRYPT_MODE,
skeySpec,
new IvParameterSpec(iv.getBytes()));
byte[] encrypted = cipher.doFinal(msg.getBytes());
return byteArrayToHex(encrypted);
}
public static String aesDecrypt(String msg,byte[] key ) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String iv = "AAAAAAAAAAAAAAAA";
cipher.init(Cipher.DECRYPT_MODE,
skeySpec,
new IvParameterSpec(iv.getBytes()));
byte[] encrypted = hexToByteArray(msg);
byte[] original = cipher.doFinal(encrypted);
return new String(original);
}
public static byte[] hexToByteArray(String hex) {
if (hex == null || hex.length() == 0) {
return null;
}
byte[] ba = new byte[hex.length() / 2];
for (int i = 0; i < ba.length; i++) {
ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
}
return ba;
}
// byte[] to hex
public static String byteArrayToHex(byte[] ba) {
if (ba == null || ba.length == 0) {
return null;
}
StringBuffer sb = new StringBuffer(ba.length * 2);
String hexNumber;
for (int x = 0; x < ba.length; x++) {
hexNumber = "0" + Integer.toHexString(0xff & ba[x]);
sb.append(hexNumber.substring(hexNumber.length() - 2));
}
return sb.toString();
}
}
프로젝트 우클릭 => maven=>update project
project=> clean
use ureca;
drop table if exists cart;
CREATE TABLE cart (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
prodcode INT,
quantity INT DEFAULT 1,
CONSTRAINT unique_cart UNIQUE (email, prodcode)
);
sql 쿼리문 cart
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shop.cafe.dao.CartDao">
<insert id="addToCart" parameterType="Cart">
INSERT INTO cart (email, prodcode, quantity)
VALUES (#{email}, #{prodcode}, 1)
ON DUPLICATE KEY UPDATE quantity = quantity + 1;
</insert>
</mapper>
package com.shop.cafe.controller;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import com.shop.cafe.dto.Cart;
import com.shop.cafe.dto.Review;
import com.shop.cafe.service.CartService;
import com.shop.cafe.service.MemberService;
@RestController
@CrossOrigin("http://localhost:5500/")
public class CartController {
@Autowired
CartService cartService;
@Autowired
MemberService memberService;
@PostMapping("addToCart")
public Map<String,String> addToCart(@RequestBody Cart cart,@RequestHeader String authorization) {
Map<String, String> response = new HashMap();
System.out.println(authorization);
try {
// 1️⃣ 로그인 확인 후 return
if (authorization == null || authorization.trim().equals("")) {
response.put("msg", "로그인을 해주세요");
return response;
}
Date loginTime = memberService.getLoginTimeByToken(authorization);
Date currentTime = new Date(); // 현재 시간
// 3️⃣ 로그인 유지 시간 계산 (밀리초 → 분 변환)
long sessionStorageDeleteTime = (currentTime.getTime() - loginTime.getTime()) / (1000 * 60) ;
System.out.println("로그인 유지 시간(분): " + sessionStorageDeleteTime);
if (sessionStorageDeleteTime > 30) {
memberService.logout(authorization);
response.put("msg", "로그인 만료되었습니다. 다시 로그인하세요.");
return response;
}
cartService.addToCart(cart);
memberService.updateLoginTime(authorization, currentTime);
} catch (Exception e) {
e.printStackTrace();
response.put("msg", "장바구니 추가 중 오류가 발생했습니다.");
return response;
}
return response;
}
}