Web Filter에서 Spring bean 사용하기

web.xml에서 정의하는 filter들은 기본적으로 servlet container(was)에 의해서 control됩니다. 이 것들은 spring과는 아무런 관련이 없는 것들이죠. 따라서, spring framework에서 사용하는 DI 즉, @Autowired 같은 것들을 사용할 수 없습니다.

어떻게 하면 DI를 가능하게 할 수 있을까요?

org.springframework.web.filter.DelegatingFilterProxy

위 Class가 그것을 가능하게 해 줍니다. 아래 web.xml 설정을 보시죠.

<filter>
  <filter-name>myfilter</filter-name>
  <filter-class>
    org.springframework.web.filter.DelegatingFilterProxy
  </filter-class>
</filter>
<filter-mapping>
  <filter-name>myfilter</filter-name>
  <url-pattern>*.do</url-pattern>
</filter-mapping>

위 설정은  *.do와 같은 형태로 들어오는 request를 DelegatingFilterProxy가 처리한다는 설정입니다. 그런데, 이 Class는 좀 특이하게 행동합니다. 아래는 Filter class 입니다.

package per.yym.filter;

// import 생략

@Service("myfilter")
public class MySpecialFilter implements Filter {

  @Autowired
  UserService userservice;

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

  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain filterChain) throws IOException, ServletException {

    .. 생략

    String message = messageBuilder.getErrorMessage("AUTH_ERROR");
    filterChain.doFilter(request, response);
  }

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

위 Class의 @Service Value인 “myfilter”에 주목해 주십시오.
web.xml의 filter-name과 일치합니다.

DelegatingFilterProxy는 자신이 직접 request를 처리하는 것이 아니라, filter-name에 정의된 이름을 ID로 사용하는 Class instance를 Spring으로부터 얻어서 그 것이 처리하도록 Proxy 역할을 합니다.

그리고, 위 Class는 @Service로 정의되어 있기 때문에 Spring bean이고, 그렇게 때문에, @Autowired를 사용할 수 있습니다.

맘에 드네요 ^^

Jar 파일에 JSP 파일 넣는 방법

이 방법은 servlet 3.0 을 지원하는 WAS에서만 가능한 방법입니다.

웹 관련 라이브러리를 만들다보면, UI(HTML, JSP, Javascript, css 등) 파일을 함께 배포하고 싶을 때가 있습니다. 즉, 비밀번호 등록 기능 뿐 아니라, 비밀번호 등록 화면까지도 라이브러리에 넣고 싶은 경우가 일 예가 되겠습니다.

그런데, Java 라이브러리는 Jar파일로 만들어야 할 터인데, 화면은 보통 JSP로 만들고…
이것을 어떻게 배포해야 할까요?

META-INF folder를 이용하면 됩니다.
META-INF folder 밑에 resources라는 folder를 만들고, 그 밑에 css, javascript, jsp, html 등을 넣어 jar로 묶어 배포하면 됩니다.
jar 파일의 META-INF/resources folder는  web root로 인식되도록 약속되어 있기 때문입니다.

예를 들어, mylib.jar 파일 안에 “META-INF/resources/jsp/main.jsp”라는 파일이 있다면, 브라우저에서
http://xxxxx.com/jsp/main.jsp ” 라고 입력하면, 브라우저에 jsp 파일 내용이 출력됩니다.
그런데, 요즘에는 Spring을 사용하면서, jsp 파일이 직접 호출되는 것을 막기 위해 “WEB-INF” 밑에 두고 템플릿 엔진을 사용하는 것이 일반화 되었죠. 이것 역시 아래와 같이 jar 파일을 구성하면, jsp 파일을 브라우저에서 직접 호출할 수 없게 됩니다.
<jar 파일>/META-INF/resources/WEB-INF/jsp/main.jsp

정리하자면, jar 파일안에 있는 “META-INF/resources”는 이 파일을 라이브러리로 사용하는 Web project의 web root와 동일하게 인식한다는 것입니다.