※ 보안을 위해 유사한 흐름의 코드를 작성하여 예시를 통해 설명합니다.
1. 에러로그 발생 상황
jsp 페이지 내에서 권한이 없을 경우 다른페이지로 리다이렉션이 되도록
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*"
%><%
class Example(){
public String exampleText = null;
//web에 필요한 정보를 전달받아 구성하기 위해 생성자 파라미터 넣음
public example(HttpServletRequest p_req,HttpServletResponse p_res
,ServletConfig p_ServletConfig){
//권한검사 후 권한이 없을경우 response에게 sendRedirect를 시킨다.
if(p_req.getParameter("auth").equals("none")){
p_res.sendRedirect("/noAuth.jsp");
return;
}
//그외 권한이 정상적일경우 작성될 내용 아무것이나..
exampleText = "<span>안녕하세요</span>";
}
}
Example example = new Example(request,response,config);
%>
<BODY>
<% out.println(example.exampleText);%>
</BODY>
이와 같은 코드를 jsp의 java scriptlet 내에 작성해주었다.
이때 해당 에러가 발생했다.
2. 왜 에러를 예상하지 못했는지?
아직 개발의 주니어로 경험이 풍부하지 못해 코드의 흐름은 당연히 위에서 아래로 이어질 것이라고만 생각하였음.
그렇기때문에 class내에서 redirect를 지정해주고 return을 해줄경우 해당페이지의 로딩은 끝날것이라고 예측함.
3. 어째서 에러가 발생했는지?
해당 에러는 response에서 발생했다.
우선 이전에 우리는 jsp페이지가 로딩될때 어떤일이 일어나는지부터 알아야 이 문제의 원인을 알 수 있다.
우선 writer들의 출력 방식들을 보자.
이런식으로 두가지방식을 통해 화면으로 전달을 하게된다.
이때 Printwriter는 우리가 response.getWriter()와 같은 내장함수 response의 메서드로 얻어서 아용하는 방식이며
두가지방식의 공통점은 브라우저로 출력! 을 하게 된다는 것이다.
이때 out은 jspwriter인데 out을 통해 브라우저로 우선 전달된 내용이 있다면, 이미 내용이 전달된 상태이므로
response는 더이상 작동할수 없고 에러를 발생시킨다.
4. 어떻게 해결할 것인가?
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*"
%><%
//객체가 선언만되었음! 아직 생성되지않음..
class Example(){
public String exampleText = null;
//web에 필요한 정보를 전달받아 구성하기 위해 생성자 파라미터 넣음
public example(HttpServletRequest p_req,HttpServletResponse p_res
,ServletConfig p_ServletConfig){
//그외 권한이 정상적일경우 작성될 내용 아무것이나..
exampleText = "<span>안녕하세요</span>";
}
}
//객체의 선언이 이루어지기전에 sendRedirect후 더이상 실행되지않게함.
if(p_req.getParameter("auth").equals("none")){
p_res.sendRedirect("/noAuth.jsp");
return;
}
Example example = new Example(request,response,config);
%>
<BODY>
<% out.println(example.exampleText); //이후에 out이 있으나 return으로 인해 실행되지않음.%>
</BODY>
이와 같은 방식으로 out이 발생하기 전에 return을 jsp scriptlet 구간으로 이동하여 후의 코드 진행을 막아주면된다.
'Web > TroubleShooting' 카테고리의 다른 글
mouse over 시 ajax 통신으로 인한 과도한 통신 해소(캐싱처리) (0) | 2025.03.04 |
---|