카테고리 없음

0312 오후수업2 (admin_LTE intercept 적용)

unemo 2021. 3. 12. 16:14
반응형

1. 파일이 첨부되면 (pds resgist)에서 첨부된 파일에 관련된 내용을 로그로 기록하는 인터셉터를 하나 만들고

2. 제목에 스크립트작성해서 발생하는 오류를 예방할수잇는 인터셉트 만들거임

 

pds 컨트롤러 regist 수정

 

첨부파일은 pdsregist가 끝난후에 모델에 심어져서 와야함

@RequestMapping(value = "/regist", method = RequestMethod.POST, 
					produces = "text/plain;charset=utf-8")
	public void regist(PdsRegistCommand registReq,
					   HttpServletRequest request,HttpServletResponse response)
			throws Exception {
		List<AttachVO> attachList = saveFile(registReq);
		
		PdsVO pds = registReq.toPdsVO();
		pds.setAttachList(attachList);
		
		service.regist(pds);
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<script>");
		out.println("alert('정상적으로 등록되었습니다.');");
		out.println("window.opener.location.href='"+request.getContextPath()+"/pds/list';");
		out.println("window.close();");
		out.println("</script>");
		
	}

 

지금 모델이 없음

 

 

package kr.or.ddit.interceptor;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import kr.or.ddit.dto.AttachVO;
import kr.or.ddit.dto.MemberVO;

public class AttachFileLogInterceptor extends HandlerInterceptorAdapter {
//첨부파일은 pdsregist가 끝난후에 모델에 심어져서 와야함

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {

		Map<String, Object> modelMap = modelAndView.getModel();
		List<AttachVO> attachList = (List<AttachVO>) modelMap.get("attachList");
		
		MemberVO loginUser = (MemberVO)request.getSession().getAttribute("loginUser");
		String log = "[File]"//파ㄹ일등록자 아이디,이름,날짜 {파일명, 파일명...},경로
				+request.getRequestURI().replace(request.getContextPath(), "")+","
				+loginUser.getId() + ","
				+loginUser.getName() + ","
				+new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+","+"{";
		
		if(attachList!=null) {
			for(AttachVO attach : attachList) {
				log += attach.getFileName() + " ";
			}
		}
		log += "}," + attachList.get(0).getUploadPath();
		
		//log file 저장
		String savePath = "d:\\log";
		if(!new File(savePath).exists())){
			new File(savePath).mkdirs();
		}
		
		String logFilePath = savePath + File.separator + "attach_file_log.csv";
		
		BufferedWriter out = new BufferedWriter(new FileWriter(logFilePath, true));
		
		//로그를 기록
		out.write(log);
		out.newLine();
		out.close();
	
	}
	
}

서블렛컨텍스트

 

 <interceptors>
   	<interceptor>
   		<mapping path="/pds/regist.do"/>
   		<mapping path="/pds/modify.do"/>
   		<beans:bean class="kr.or.ddit.interceptor.AttachFileLogInterceptor"/>
   	</interceptor>
   
   </interceptors>

 

수정

야매

 

저 레스판스때문에 (화면결정자가 있으면 안된다는말) 모뎅ㄹ엔뷰가 인터셉트에 넘어가지않음.. 레지스트랑 모디파이 둘다 리스펀스를 없애고 레지스트포스트랑 모디파이포스트에서 리다이렉트를하되 (모델은 받앗으니 스트링 화면은넘기게됨 (리다이렉트) 스크립트문을 리다이렉트로 바꿔야함 그럼 모델이 인터셉터로 들어오게됨 만약리다이렉트가 어려우면 포워드를 해도 리다이렉트를 시킬수가잇음 jsp에서 스크립트작업하면되니까.. 어쩃든 response쓰지않고 이 기능이 되도록만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 <script>
	alert('정상적으로 등록되었습니다.');
	if(window.opener) window.opener.location.href='"+request.getContextPath()+"/pds/list';
	window.close();
 </script>

 

 

modify 도 (모델파라미터 추가하기)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
 <script>
	alert('정상적으로 수정되었습니다.');
	location.href='detail?pno=${pds.pno}&from=modify';
	window.close();
 </script>


cross site script? 해결할수있는 인터셉터 만들어보자

 

필요한 자르가잇음

//pre핸들러로 만들거임
//해당 레지스트랑 모디파이에 리퀘스트가 오게되면 가각ㄱ파라미터꺼내서
//<script>를 다 gtlt로 바꿔서 저장할거임

 

컨트롤러에서 받기 전에 처리해야하기때문에

 

 

여기에 웹라이ㅡ러리가 없어서 lib에 넣어도 빌드업이 되지않고잇엇다

웹앱어쩌구라이브러리추가ㅣ

 

파라미터의 값을 꺼내서 필터적용한 밸류는 어트리뷰트이름은 그대로 심는다.

그럼 컨트롤러족에서 그럴것이 우려가 되는것들은(타이틀, (내용은 스마트에디터가 하기떄문에 상관없음)) 파라미터에서 꺼내는게 아니라 어트리뷰트에서 꺼내는것 그럼 gtlt로바뀐내용이나온다.

통과했다는 표시

request에서 어트리뷰트를 XSS로 끄내면 변환된 값이 나오는것

이렇게꺼낼거임 컨트롤러에서.. 이렇게 바꿔치기하는거임

 

 

서블렛컨텍스트

 

 

보이는건 꺾쇠가 보이지만

실제소스는 gtlt 로 바뀌어잇다

 

 

반응형