TIL day 56

최병은·2024년 3월 19일
  1. 코딩테스트(할인 행사)
class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        int days = 10;

        Map<String,Integer> wantMap = new HashMap<>();
        for (int i = 0; i < want.length; i++) {
            wantMap.put(want[i],number[i]);
        }

        for (int i = 0; i < discount.length - days + 1; i++) {
            Map<String,Integer> discountMap = new HashMap<>();
            for (int j = 0; j < days; j++) {
                discountMap.put(
                    discount[i+j],
                    discountMap.getOrDefault(discount[i+j],0) + 1);
            }
            
            boolean result = true;
            
            for (String a : wantMap.keySet()) {
                if(wantMap.get(a) != discountMap.get(a)) {
                    result = false;
                }
            }
            
            if(result) {
                answer++;
            }
        }
        return answer;
    }
}

discountMap.put(discount[i+j],discountMap.getOrDefault(discount[i+j],0) + 1);

discount[i+j]를 put할 때 같은 값이 있으면 그 키값의 value값을 가져오고 없으면 0(default값)을 가져온다.


  1. Jwt 검증 중 에러 발생
// header 에서 JWT 가져오기
	public String getJwtFromHeader(HttpServletRequest request) {

		String bearerToken = request.getHeader(AUTHORIZATION_HEADER);

//		if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) {
//			return bearerToken.substring(7);
//		}

		return bearerToken;
	}
    
    // JWT 토큰 substring
	public String substringToken(String tokenValue) {
		if (StringUtils.hasText(tokenValue) && tokenValue.startsWith(BEARER_PREFIX)) {
			return tokenValue.substring(7);
		}
		logger.error("Not Found Token");
		throw new NullPointerException("Not Found Token");
	}
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException {

		String tokenValue = jwtUtil.getJwtFromHeader(req);

		if (StringUtils.hasText(tokenValue)) {
			// JWT 토큰 substring
			tokenValue = jwtUtil.substringToken(tokenValue);
//			log.info(tokenValue);

			if (!jwtUtil.validateToken(tokenValue)) {
				log.error("Token Error");
				res.setStatus(HttpServletResponse.SC_BAD_REQUEST);
				res.setCharacterEncoding("utf-8");
				res.getWriter().write("토큰이 유효하지 않습니다.");
				return;
			}

			Claims info = jwtUtil.getUserInfoFromToken(tokenValue);

			try {
				setAuthentication(info.getSubject());
			} catch (Exception e) {
				log.error(e.getMessage());
				return;
			}
		}

		filterChain.doFilter(req, res);
	}

로그에 Not Found Token이 뜨길래 왜 그러지 하고 봤는데 토큰이 getJwtFromHeader에서 이미 "Bearer "이 짤려서 반환되고 있었다. 그래서 substringToken에서 "Bearer "로 시작을 안하니까 에러가 난 것 같다. 디버그를 하면서 jwt 검증, 인가 경로를 볼 수 있었다.

profile
안녕하세요

0개의 댓글