본문 바로가기

웹 개발 한걸음

[Servlet] 로그아웃 + UTF-8 WebFilter 구현하기

 

 

** 이전에 JSP로 만들었던 코드를 이용해 서블릿으로 아주 쉽게 구현해보았다. 다만 두가지 이슈가 발견되었다.

하나는 자바스크립트의 한글화, 나머지 하나는 forward, redirect시 이동이 우선시 되어 스크립트가 무시되는 점이었다.

 

[JSP] 7강 - 세션, 로그아웃 그리고 메인 페이지 만들기

본 포스팅은 정보 제공용이 아닌 유튜브 동빈나님의 JSP 게시판 만들기 강좌 7강을 바탕으로 보고 배운 것을 직접 정리해본 포스트 입니다. ** 로그인 구현할 때 들었던 구현하지 않은 세션 부여

egu99.tistory.com

 


 

** LogoutControl.java

@WebServlet("/logout")
public class LogoutControl extends HttpServlet{

	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1)
		//response.setCharacterEncoding("UTF-8"); 
		//response.setContentType("text/html; charset=UTF-8");
		
		HttpSession session = request.getSession();
    	  	//세션 삭제
		session.invalidate();
		PrintWriter out = response.getWriter();
		out.println("<script>");
		out.println("alert('로그아웃 되었습니다.');"); 
		out.println("location.href='main'");
		out.print("</script>");
		
      		// 2)
		//response.sendRedirect("main");
		
		
	}

 

  • session.invalidate로 세션삭제를 해주었다.
  • 여기서 LoginControl도 포함하여 두가지 문제점이 있었는데

1) LoginControl에서도 그렇고 여기 LogoutControl에서도 그렇고 PrintWriter부분, 정확히는 response에서 한글이 깨진 상태로 출력되는 것을 확인했다. LoginControl에서는 임시방편으로 해줬지만 서블릿마다 이런 코드를 넣을 순 없어서 모든 서블릿에 적용할 수 있는 필터를 만들어보기로 했다. 필터의 코드는 아래를 확인하자.

 

2) LoginControl에서 로그인 실패시, 그러니까 redirect나 forward가 없을 때 alert가 작동했지만 있을 때인 로그인 성공시에서는 alert가 뜨지 않았고 여기 로그아웃도 그러했다. 아마도 우선순위가 스크립트보다 페이지 이동이 우선시 되는 거 같다. 이동 또한 자바스크립트의 location.href=''를 이용하여 이동해주는데이 때 location.href는 get으로 가는 것을 확인했다. 우선은 잘 작동하지만 이래나 저래나 여기서 자바스크립트를 쓰는 것은 아닌듯하다.

 

 

 


 

 

** CharacterEncodingFilter.java

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

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
	
		//System.out.println("Before Filter");
		request.setCharacterEncoding("UTF-8");
		
		response.setCharacterEncoding("UTF-8"); 
		response.setContentType("text/html; charset=UTF-8");
		
		chain.doFilter(request, response);
		
		//System.out.println("After Filter");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}
}

 

  • 이전에는 web.xml을 통해 webfilter를 추가해줬지만 서블릿 3.0부터는 어노테이션만으로도 가능해졌다.
  • @WebFilter( ) 안에는 적용할 URL매핑이름을 넣어주기만 하면 된다.
  • /*처럼 와일드카드를 써 모든 어노테이션 URL 매핑에 적용할 수도 있다.