인코딩 방식이란, 문자열을 바이트로 전환하거나 반대의 과정에서 사용하는 규칙 같은 것이다.
영어는 1바이트, 한글은 2바이트를 기본으로 사용하는데, 인코딩 처리 방식을 설정안하면 비영어 언어는 html이나 get, post 전송 과정에서 깨질 수 있다.
일반적으로 요즘에는 UTF-8을 사용하는데, 거의 모든 언어의 인코딩 가능하기 때문이다.
방법1: 개별 파일 인코딩 처리
HTML 파일(JSP) 인코딩
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
참고로, include하는 파일의 인코딩 타입이 원래 파일과 다르면, 에러가 발생함.
주의사항
servlet에서 비영어 문자열을 처리하기 위해 UTF-8을 사용할 것이다.
그러기 위해서는 HTML파일이 제출하는 form도 UTF-8을 사용해야 한다.
따라서 html 파일은 인코딩 방식을 이것으로 설정하는 게 일반적이다.
예시
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
POST 처리
servlet파일에서 request 객체에 인코딩을 설정해주면 된다.
응답 객체도 마찬가지인데, 형식이 약간 다르다.
// request의 파라미터를 UTF-8로 인코딩
request.setCharacterEncoding("UTF-8");
// response가 보내는 콘텐츠가 html이며 utf-8 인코딩임을 클라이언트 브라우저에게 알림
response.setContentType("text/html; charset=utf-8");
// response를 UTF-8로 인코딩
response.setCharacterEncoding("UTF-8");
get 처리
post는 개발자가 직접 인코딩 방식을 정해서 처리해야 하는데 반해, GET은 톰캣에서 서버에 기본적으로 설정된 URI 인코딩 문자코드로 자동으로 처리를 해준다. 따라서 글자가 깨지지 않는다.
그렇지만 설정을 해야하는 경우에는 웹컨테이너 파일 내 server.xml 수정하면 된다.
수정 후에는 서버에 재동기화가 필요하다.
<!--server.xml-->
<Connector URIEncoding="UTF-8" connectionTimeout="20000" maxParameterCount="1000" port="8090" protocol="HTTP/1.1" redirectPort="8443"/>
jsp에서 jsp로 보낼 때
다른 jsp로 요청을 날릴 때는 요청을 받는 jsp 파일 최상단에
requset.setCharacterEncoding("UTF-8");
을 설정해주면 된다.
방법2: 일괄적으로 인코딩 설정(filter)
개별 설정 방식은 서블릿이나 JSP가 많을 시 불편하다.
그래서 일괄적으로 설정하는 방법으로 filter를 사용한다.
filter란, 클라이언트와 서버 사이에 오가는request와 response 사이에 filter파일을 설정하는 것이다.
과정1: filter 파일 생성
filter 역할을 할 새 파일을 생성한다. 보통, 별도의 패키지로 구성한다.
이클립스의 파일 생성에서 filter를 선택해준다.
생성 시 오류 : package javax.servlet.http does not exist
superclass를 찾을 수 없다는 오류
원래 방법은 tomcat 설치 디렉토리 안에 있는 servlet-api.jar파일을
java설치 디렉토리>jdk>jre>liv>ext 안으로 복사하면 해결된다고 한다.
내 경우에는 이 방법으로 해결 안되어서 일단 superClass를 선택하지 않았다.
과정2: filter 파일 작성
doFilter 메소드 내에서 request를 인코딩 세팅해준다.
package com.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;
import javax.servlet.annotation.WebFilter;
@WebFilter("/Filter1")
public class Filter1 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("필터 작동");
// request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("필터 생성");
}
}
과정3: web.xml 설정으로 filter 등록
만든 filter 파일을 클라이언트와 서버 사이에 배치하기 위해서 web.xml 파일을 수정한다.
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.filter.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
참고자료
'java > jsp & sevlet' 카테고리의 다른 글
DAO와 DTO (0) | 2024.05.04 |
---|---|
JDBC(java와 오라클의 통신 방법) (0) | 2024.05.04 |
[jsp&servlet] cookie, session (0) | 2024.05.04 |
[jsp&servlet] error page 설정 방법 (0) | 2024.05.04 |
[jsp& servlet] jsp 스크립트, 내장 객체, 요청 응답 (0) | 2024.05.02 |