ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Filter
    JAVA/웹 프로그래밍 - 서블릿 2020. 10. 30. 23:02

    웹 페이지 접속 시 url을 입력해야 한다. 브라우저에서 요청을 한다. 

    서버에서 해당하는 url에 대한 페이지를 다시 넘겨준다. 
    그러면 요청한쪽에서페이지가 표시가 된다.  
    다시 요청한쪽에서 페이지에 입력을 하고 다시 서버로 넘겨준다. 
    서버는 다시 url을 확인하고 서버에서 서블릿이 동작하고나서 다시 
    요청한쪽에서 다시 페이지에 표시가 된다.

    html은 바로 갔다가 다시 오지만, 서블릿인 경우에는 맵핑을 통해서 서블릿에 전달된다

    매핑을 해줄수 있는 방법은 첫 번째는 web.xml에서 설정하는 방법과 두 번째는 어노테이션을 설정해야 한다.

    두 가지 방법 중에 하나를 선택한다.

    어노테이션은 서블릿에서 설정한다. @WebServlet에 경로를 적어준다. 

                    @WebServlet("경로")

    이 매핑과 서블릿 사이에 필터라는 작업을 추가한다.
    이는 넘길지 차단할지를 결정한다. 필터를 만들때도 매핑이 필요하다.

     

    로그인 시 아무나 그 정보를 보면 안된다. 필터를 이용해서 이를 차단할 수 있다.
    한글이 깨지는 문제도 필터를 통해 미리 설정할 값을 설정할수 있다.
    그리고 다시 서블릿으로 전해준다.
    매핑시에 필터url에 갔다가 서블릿url으로 이동하고 다시 서블릿으로 동작한다.
                               필터url->서블릿url->서블릿

     

    index.html로 접속했다고 하자.

    필터는 url에 들어오는 곳에 필터가 적용이 된다.
    웹 브라우저에서 문서 요청을 하기만하면 필터는 동작을 한다.

    필터는 서블릿에 오기 전에 먼저 거쳐간다. @WebFilter("/*") 는 모든 url에 대해서 적용을 하겠다는 의미이다.

    @WebFilter("/*") 대신에 @WebFilter("/index")로 적어보고 직접 실행을 해보자.

     

    한글을 쓰기 위해서는 서블리에서 항상 다음과 같이 세 줄을 반드시 입력을 해야 했다.

    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    request.setCharacterEncoding("UTF-8");

     

    그런데 이는 번거로운 일이다.

    무언가 서버를 시작하면 이 일을 자동으로 실행하게끔 하도록 하면 참 좋을 것 같다.

     

    그래서, 이 필터라는 것이 있다.

    필터 생성하는 방법은 java resources의 하위의 패키지를 선택하고 우클릭하고 필터를 생성하면 된다.

    클래스 명은 CharacterEncodingFilter로 하자. 

    next를 클릭하고, finish를 선택한다. 그리고 주석이 달린 문장을 모두 제거한다.

    모두 지우고 다음의 문장을 복사 붙여넣기 한다. 서블릿과 다르게 이 파일은 자바 파일과 같다.

    chain.doFilter(request, response); 구문을 적고 안 적고에 따라 화면이 나오고 안 나온다. 

    이를 문장을 주석처리함으로 알 수있다, 

    즉, 이 문자을 주석 처리하고 서버를 실행해서 웹 브라우저의 주소 창에 localhost:9090이라 쳐보자.

    아무 내용이 나오지 않는다. 이는 필터가 차단했다는 의미이다.

    다시 이 구문을 주석 처리 해제하고 다시 실행하면 index.html의 정보가 나타 난다. 

    그리고 chain.doFilter(request, response); 구문을 중심으로 위의 위와 아래로 나뉘게 된다.

    이 의미는 url이 호출되고나서 해야할 일은 구문 아래쪽에 작성한다.

    이를 이용해서 나중에 로그인 시에 로그인 세션을 확인 가능하다.
    이 세션이 비어있는 상태에 따라 로그인 중인지 아닌지를 알 수 있다.

    CharacterEncodingFilter.java

    더보기
    package com.iot.web;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    
    @WebFilter("/*")	//	필터 설정
    public class CharacterEncodingFilter implements Filter {
    
    	@Override
    	public void doFilter(ServletRequest request, 
    			ServletResponse response, 
    			FilterChain chain)throws IOException, ServletException 
    	{
    		/*
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		*/
    		
    		System.out.println("Before fillter");	//	필터 전 실행
    		
    		chain.doFilter(request, response);
    		
    		System.out.println("After fillter");	//	필터 후 실행
    	}
    }

     

    그리고 WebContent의 WEB-INF의 하위 폴더에 web.xml 파일이 있는데 이를 열어보자.

    아래의 내용을 복사해서 붙여 넣자.

    web.xml파일을 열면 가끔 소스 코드가 보이지 않는 경우가 있는데, 왼쪽 하단쪽에 Design과 Source 탭이 있는데

    Source 탭을 클릭하면 된다.

    웹 브라우저를 띄우고localhost:9090 주소로 이동하면 index.html이 제대로 나온다.

    주소 창에 index.html을 적지 않아도 index.html의 내용이 나오는 이유는 아래의 web.xml의 설정을 이유로 해서 그렇다.

    그래서 이 index.html을 저지 않아도 기본으로 호출된다.

    web.xml

    더보기
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
    <!-- 
    <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.iot.web.CharacterEncodingFilter</filter-class>
    </filter>
    
    <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
     -->
      <display-name>iot</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     

    아무 html 파일을 실행시키자.

    index.html을 실행시킬 것이다.

    서버를 실행시키고, 웹 브라우저를 하나 띄우고 주소에 localhost:9090/index.html 이라고 접속하고 나서

    자바로 되돌아 와서 콘솔 입력 창에 보면 다음과 같은 문구가 뜬다.

     

    소스 파일

    web.xml
    0.00MB
    CharacterEncodingFilter.java
    0.00MB

     

     

     

    index.html 파일에서 form 태그의 action은 Notice이므로 

    Notice.java로 이동해서 request.setCharacterEncoding("UTF-8"); 문장엘 주석처리하고

    CharacterEncodingFilter.java로 이동해서 service함수에서

    chain.doFilter(request, response); 구문 바로 위에 request.setCharacterEncoding("UTF-8");을 추가하자.

    추가한 문장은 아래의 그림을 참고하자.

    한글을 입력하고 웹 페이지에 그 내용이 뜨는지 확인해보자.

    다시 서버를 실행해보자.

    아래는 CharacterEncodingFilter.java의 service함수이다.

     

    아래는 Notice.java

     

    실행결과를 보자.

    아래와 같이 한글을 입력하고 글입력 버튼을 클릭하면

    다음과 같이 웹 페이지에 한글이 써진다.

     

    전체 소스 파일

    CharacterEncodingFilter.java
    0.00MB
    index.html
    0.00MB
    Notice.java
    0.00MB
    web.xml
    0.00MB

     

    댓글

Designed by Tistory.