반응형
필터는 클라이언트와 서버 사이에서 요청과 응답을 먼저 받아 처리해주도록 해주는 기능입니다.
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
반응형
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
자바기반의 웹&앱 응용 SW개발자 양성과정 65일차 -97 (0) | 2020.06.14 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 64일차 -96 (0) | 2020.06.12 |
자바기반의 웹&앱 응용 SW개발자 양성과정 62일차 -94 (0) | 2020.06.03 |
자바기반의 웹&앱 응용 SW개발자 양성과정 61일차 -93 (0) | 2020.06.02 |
자바기반의 웹&앱 응용 SW개발자 양성과정 60일차 -92 (0) | 2020.06.01 |
댓글