sitemash를 이용해서 레이아웃을 구성하는 경우 간혹 서버의 인코딩 문제로 한글이 깨지는 경우가 생길수 있습니다. was의 영향을 받기도 하겠죠... 이 경우 

was의 dfile.encoding을 하면 한큐에 해결 되지만 그렇지 않고 간혹 예전 라이브러리 때문에 어쩔수 없이

인코딩을 변경 하지 못하는 경우 


response의 인코딩 부분을 filter를 이용해서 변경 해줘야 합니다.


import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;


public class CharsetEncodingFilter implements Filter{

private String encoding;

    protected FilterConfig filterConfig;


    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;

        this.encoding = filterConfig.getInitParameter("encoding");

    }


    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        servletRequest.setCharacterEncoding(this.encoding);

        servletResponse.setContentType("text/html;charset=" + this.encoding);

        filterChain.doFilter(servletRequest, servletResponse);

    }


    public void destroy() {

        this.encoding = null;

        this.filterConfig = null;

    }

}


setCharacterEncoding 만으로는 완벽하지 않습니다. setContentType 이게 꼭 같이 들어가 줘야 합니다.


혹은 com.opensymphony.module.sitemesh.filter.PageFilter 를 오버라이딩 해서 


import javax.servlet.FilterChain;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;


import com.opensymphony.module.sitemesh.filter.PageFilter;


public class EncodingPageFilter extends PageFilter {


public EncodingConfigurableSiteMeshFilter() {

super();

}


@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws java.io.IOException, ServletException {

servletRequest.setCharacterEncoding("UTF-8");

servletResponse.setContentType("text/html;charset=UTF-8");

super.doFilter(servletRequest,servletResponse, filterChain);

}


web.xml의 sitemash가 바라보는 class를 해당 class로 변경 해주는 방법도 있습니다.
여기서 중요한건 

servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=UTF-8");


이 부분을 어딘가에서는 변경 해줘야 한다는 겁니다.

interceptor 설정으로는 동작 하지 않습니다. web.xml에서 필터 혹은 참조 class를 변경해서 처리 해줘야 합니다.

반응형
Posted by 질주하는구
,