Developer Note/국비과정 수업내용 정리&저장

24년 11월 06일

DH_PARK 2024. 11. 20. 23:55

Enum 이란 ? (열거형 클래스)

미리 정의된 상수들의 특별한 집합

enum (enumeration number) : 즉 상수들을 열거한 것이 enum이다.

enum에 열거된 상수들은 추가적인 객체 생성 없이 외부에서 사용이 가능하다.

그리고 상수들 앞에 아무런 자료형이 붙지 않지만 기본적으로 public static final 이다.

기본적으로 final 인 상수이기 때문에 모두 대문자로 적는것을 원칙으로 한다.

사용이유 :

  • 가독성증가. 코드가 단순해진다.
  • 컴파일 시 데이터 타입 및 유효성 체크를 할 수 있다.
  • 허용 가능한 값 제한가능
  • 수정 시 변경 범위가 최소화 된다.

사용 함수

ordinal : 열개 객체의 순번(0부터 시작)을 리턴

name() : 열거 객체의 문자열을 리턴

values() : 모든 열거 객체들을 배열로 리턴

valueOf(String name) : 문자열을 입력받아 일치하는 열거 객체를 리턴


public class PermissionFilter implements Filter
{

	Map<String,ROLE> pageGradeMap = new HashMap();	// URL : Permission Value
														// /user.do 	: 0
														// /member.do 	: 1
														// /admin.do 	: 2
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		String projectPath = filterConfig.getServletContext().getContextPath();
	
		pageGradeMap.put(projectPath+"/book/add",ROLE.ROLE_MEMBER);	//1
		

	}
	

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		//
		System.out.println("[Filter] PermissionFilter..Start");
		
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;

		HttpSession session = req.getSession();
		String myRole = (String)session.getAttribute("role");
		if(myRole==null) {
			resp.sendRedirect(req.getContextPath()+"/login?message=" + URLEncoder.encode("로그인이 필요한 서비스입니다","UTF-8"));
			return ;
		}
		//role값 존재하는 경우
		String url = req.getRequestURI();	// /PJ/user.do , /PJ/member.do , /PJ/admin.do , etc..
		ROLE pageRole =  pageGradeMap.get(url);
		System.out.println("URL : " + url + " pageRole : " + pageRole+ " myRole : " + myRole);
		
		
		ROLE myRoleVal =null;
		if("ROLE_ADMIN".equals(myRole)) {
			myRoleVal = ROLE.ROLE_ADMIN;
		}else if("ROLE_MEMBER".equals(myRole)) {
			myRoleVal = ROLE.ROLE_MEMBER;
		}else if("ROLE_USER".equals(myRole)){
			myRoleVal = ROLE.ROLE_USER;
		}else {
			;
		}
		
		//pageRole<=myRole -> 허용
		if(pageRole.ordinal() > myRoleVal.ordinal()) {
			//pageRole>myRole -> 권한부족(예외페이지로 이동 - Forward / Redirect error.jsp)
			//throw new ServletException("해당 권한으로는 접근이 불가능한 페이지 입니다.");
			resp.sendRedirect(req.getContextPath()+"/error.jsp?message=" + URLEncoder.encode("페이지에 해당 계정 권한이 부족합니다.","UTF-8"));
			return ;
		}
		
		
		chain.doFilter(request, response);

		//
		System.out.println("[Filter] PermissionFilter..End");

	}

}

enum을 사용한 filter 에서 회원등급 구별.

session에서 role이라는 세션값을 얻은후에 role이 비어있다면 로그인 페이지로 리다이렉팅 되게하고,

String url = req.getRequestURI();
ROLE pageRole = pageGradeMap.get(url);

여기서 getRequestURI 는 요청 URL 을 가져옴.

ex) Myapp/book/add

위에서 pageGradeMap 에 book/add 주소에 ROLE_MEMBER 를 할당해놓아서 이 주소를 요청할 시에는 최소 ROLE_MEMBER 이상이어야 접근이 가능하게 해놓음. 그리고 권한을 비교해서 변수에 권한이 담긴 값을 담아서 특정 회원의 role이 ROLE_MEMBER 보다 높은지 검사. 높다면 다음 페이지로 요청을 넘기고 , 권한이 낮다면 에러페이지와 권한이 부족하다는 메시지를 함께 출력해준다.



파일 입출력

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) {
	System.out.println("GET /profile/image");
		
		
		String username = req.getParameter("username");
		
		String path = UploadProperties.uploadPath
					+ File.separator
					+ UploadProperties.profilePath
					+ File.separator
					+ username
					+ File.separator;
		
		File file = new File(path + "profileImg.jpg");  //파일 객체 생성
		
		String mimeType = "application/octet-stream";  //MIME 타입
	//바이너리 데이터를 전송할 때 사용된다
	
		resp.setContentType(mimeType); //Content-Type 을 설정한다
		resp.setContentLengthLong(file.length()); //파일의 길이를 설정하여 전송한다

		//스트림전송
		try {
			FileInputStream fin = new FileInputStream(file); //파일 읽기 스트림
			ServletOutputStream sout = resp.getOutputStream(); //응답 출력 스트림
			byte [] buff = new byte[1024]; //버퍼 크기 설정
			while(true) {
				int cnt = fin.read(buff); //버퍼에 파일 데이터 읽기
				if(cnt==-1)  //EOF(파일 끝) 체크 , 다 읽어서 0이하 값이 나오면 종료
					break;
				sout.write(buff,0,cnt); //클라이언트에 데이터 전송
				sout.flush();
			}
			

MIME 타입이란 ?

웹을 통해서 여러 형태의 파일을 전달하는데 사용된다. 파일 변환을 뜻함


 

쿼리스트링의 형식

쿼리스트링이란 사용자가 입력 데이터를 전달하는 방법중의 하나로 url 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것.

  • 엔드포인트 주소 이후에 ? 를 써서 쿼리스트링의 시작을 알린다.
  • parameter =value 형식으로 필요한 파라미터 값을 적는다.
  • = 으로 key 와 value를 구분함.
  • 파라미터가 여러개일 경우에는 & 를 붙여 여러 파라미터를 넘길 수 있다.

'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글

24년 11월 11일  (1) 2024.11.21
24년 11월 08일  (2) 2024.11.21
24년 11월 7일  (0) 2024.11.19
24년 11월 5일  (0) 2024.11.11
24년 11월 4일  (4) 2024.11.06