본문 바로가기
웹 프로그래밍 기초/자바기반의 웹&앱 응용SW 개발자

자바기반의 웹&앱 응용 SW개발자 양성과정 63일차 -95

by oncerun 2020. 6. 11.
반응형

필터는 클라이언트와 서버 사이에서 요청과 응답을 먼저 받아 처리해주도록 해주는 기능입니다.

 

 

package com.newlecture.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter("/*")
public class AuthenticationFilter implements Filter {

   private static final String[] interceptURLs = {"/admin/","특정url"};
   
   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
         throws IOException, ServletException {
   
      HttpServletRequest httpRequest = (HttpServletRequest)request;
      HttpServletResponse httpResponse = (HttpServletResponse)response;
      
      String uri = httpRequest.getRequestURI();
      
      HttpSession session = httpRequest.getSession();
      //인증과 권한 검사가 필요하다.
         if(uri.startWith("/admin/")){
         
         Object uid = session.getAttribute("uid"); 
         
         if(uid == null) // 인증 방식이 안되었어? 그럼 로그인하고 와
            httpResponse.sendRedirect("/member/login?returnURL="+uri);
            
         else {
         
            String role = String.valueOf(session.getAttribute("role"));
            //String role = service.getRoleByUserId(userName);
            
            if(role != null && !role.equals("admin"))
               httpResponse.sendRedirect("../error/403");               
         }
       }
      chain.doFilter(request, response);

   }

}

인증 필터는 맵핑된 페이지를 요청하는 경우 실행된다. 관리자 페이지에 접속하기 위해서 인증을 하여 해당되는 경우만 다음 페이지를 넘겨주게 됩니다.

 

package com.newlecture.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter{

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
         throws IOException, ServletException {
      
      request.setCharacterEncoding("UTF-8");
      //사전실행
      System.out.println("인코딩필터");
      //다음 서블릿 또는 필터가 실행되도록
      chain.doFilter(request,response);
   }

}

 

파일 업로드

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      request.setCharacterEncoding("UTF-8");
      response.setContentType("UTF-8");
         
      String title = request.getParameter("title");
      String content = request.getParameter("content");
      
      Collection<Part> parts = request.getParts();
      String fileNames =""; // DB에 들어갈 파일명
      
      for(Part part:parts){
         String name = part.getName();
         
         //범위블럭 최대한 안감싸는게 좋다.. part name이 file인것만 실행한다.
         if(!name.equals("file")) continue;
         
      //업로드한 파일 저장하기
//         Part filePart = request.getPart("file");
         String fileName = part.getSubmittedFileName();
         String realPath = request.getServletContext().getRealPath("/upload");
         String filePath = realPath + File.separator +fileName;
   //      System.out.println(realPath);
         
         InputStream fis = part.getInputStream(); //file 파트에 저장된 바이너리를 읽기위한 인풋 스트림
         FileOutputStream fos = new FileOutputStream(filePath); //얻은 물리경로에 쓰기위한 아웃풋
         
         byte[] buf = new byte[1024];
         int size = 0;
         while((size=fis.read(buf)) != -1)
            fos.write(buf,0,size);
         
         fos.close();
         fis.close();

         fileNames += fileName;
         fileNames += ",";

      };
      
      fileNames = fileNames.substring(0, fileNames.length()-1);
      
      //데이터 등록
      Notice notice = new Notice();
      notice.setTitle(title);
      notice.setWriterId("yuno");
      notice.setContent(content);
      notice.setFiles(fileNames);
      
      NoticeService service = new NoticeService();
      try {
         service.insertNotice(notice);
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      } catch (SQLException e) {
         e.printStackTrace();
      }
      
      response.sendRedirect("list");
   }

 

getName()은 파라미터의 값을 가져오며

getContentType()은 enctype을 얻어온다

이것은 내가 form을 생성할 때 파라미터 값을 내가 아는 값으로 지정했을 경우 getName()으로 가져와 조건 처리할 수 있지만 내가 만들지 않았을 경우에는 header의 값으로 조건 처리해주어야 한다

			if(p.getHeader("Content-Disposition").contains("filename=")) {
				
				if(p.getSize()>0) {
					String fileName = p.getSubmittedFileName();
					String filePath = realPath + File.separator + fileName;
					p.write(filePath);
					p.delete();
					request.setAttribute("n",fileName);
				}
			}

 

편집기 만들기.

 

textarea는 썼을 경우 텍스트만 쓸 수 있지만 contenteditable="true"를 설정한다면 

모든 태그에 쓸 수가 있습니다. 뷰 형태로 나타납니다.

 

만약 div태그의 contenteditable="true"를 사용했을 경우 엔터를 누를 때마다 div태그가 삽입됩니다.

 

부모가 가지고 있는 스타일을 포함하고 있으므로 배제하는 방법이 필요합니다.

css속성 중 all : unset을 사용해 모든 스타일을 초기화시킬 수 있습니다.

또한 iframe을 이용해 페이지를 분리시킬 수 있습니다.

 

 

 

window.addEventListener("load", function () {

    const boldBtn = document.querySelector(".btn-bold");
    const htmlArea = document.querySelector(".html-area");

    boldBtn.addEventListener("click", function (e) {
        e.preventDefault();
        document.execCommand("bold");
    })

})

execCommand로 명령을 전달해줄 수 있습니다.

마우스로 선택한 영역의 부분에 명령을 전달해 스타일을 변경할 수 있습니다.

https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand#Commands

반응형

댓글