지금까지 Spring 설정파일이나 Web.xml 파일의 JavaConfig형태로 사용하는것에 대해서 큰 필요성을 느끼지 못해 굳이 사용하고 있지 않았었다.
그런데 최근 Filter를 운영환경에서만 추가로 설정해야 할 필요가 생겨났다.
Filter를 상속받아서 처리해도 되겠지만 생각난김에 web.xml을 Java Code로 변경해 보았다.
[WebXml.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | package config; import java.util.EnumSet; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.XmlWebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.multipart.support.MultipartFilter; import org.springframework.web.servlet.DispatcherServlet; import pe.kr.ddakker.core.framework.web.GlobalsProperties; import pe.kr.ddakker.core.support.util.StringUtils; /** * /WEB-INF/Web.xml 설정 * @author ddakker 2014. 10. 13. */ public class WebXml implements WebApplicationInitializer { private static Logger log = LoggerFactory.getLogger(WebXml. class ); @Override public void onStartup(ServletContext servletContext) throws ServletException { // 스프링 설정 XmlWebApplicationContext rootContext = new XmlWebApplicationContext(); rootContext.setConfigLocations( new String[] { "classpath:config/spring/context-*.xml" }); rootContext.refresh(); rootContext.start(); GlobalsProperties globalsProperties = rootContext.getBean( "globalsProperties" , GlobalsProperties. class ); String serverType = StringUtils.defaultString(globalsProperties.getProperty( "server.type" ), "local" ) String domain = GlobalsProperties.REAL.equals(serverType)? "board.ddakker.pe.kr" :serverType + "-board.ddakker.pe.kr" ; log.debug( "========== domain: {} ========== " , domain); log.debug( "========== serverType: {} ========== " , serverType); // SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS Filter 영역 SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS if (GlobalsProperties.STAGE.equals(serverType) || GlobalsProperties.REAL.equals(serverType)) { // 상황에 따른 필터 추가 } // 인코딩 설정 CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding( "UTF-8" ); characterEncodingFilter.setForceEncoding( true ); FilterRegistration.Dynamic characterEncoding = servletContext.addFilter( "characterEncodingFilter" , characterEncodingFilter); characterEncoding.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true , "/*" ); // 스프링 RestFull 설정 HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); FilterRegistration.Dynamic hiddenHttpMethod = servletContext.addFilter( "hiddenHttpMethodFilter" , hiddenHttpMethodFilter); hiddenHttpMethod.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true , "/*" ); // 파일업로드 설정 MultipartFilter multipartFilter = new MultipartFilter(); FilterRegistration.Dynamic multipart = servletContext.addFilter( "multipartFilter" , multipartFilter); multipart.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true , "/*" ); // String Security 설정 DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(); FilterRegistration.Dynamic springSecurity = servletContext.addFilter( "springSecurityFilterChain" , springSecurityFilterChain); springSecurity.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true , "/*" ); // 사이트메쉬 설정 SiteMeshFilter siteMeshFilter = new SiteMeshFilter(); FilterRegistration.Dynamic siteMeshEncoding = servletContext.addFilter( "siteMeshFilter" , siteMeshFilter); siteMeshEncoding.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD), true , "/*" ); // EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Filter 영역 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE // SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS Listener 영역 SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS // String Core 설정 servletContext.addListener( new ContextLoaderListener(rootContext)); // Spring Security 증복로그인 관련 처리 여부(resources/config/spring/context-security.xml session-management->concurrency-control 부분) //servletContext.addListener(new HttpSessionEventPublisher()); // EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Listener 영역 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE // SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS Servlet 영역 SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS // 스프링 MVC 설정 XmlWebApplicationContext xmlWebApplicationContext = new XmlWebApplicationContext(); xmlWebApplicationContext.setConfigLocation( "classpath:config/spring/servlet-mvc.xml" ); ServletRegistration.Dynamic dispatcher = servletContext.addServlet( "dispatcher" , new DispatcherServlet(xmlWebApplicationContext)); dispatcher.setLoadOnStartup( 1 ); dispatcher.addMapping( "/" ); /* EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Servlet 영역 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE */ } } |
[web.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | <!--?xml version="1.0" encoding="UTF-8"?--> < web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "WebApp_ID" version = "3.0" > < display-name >...</ display-name > < context-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:config/spring/context-*.xml</ param-value > </ context-param > < filter > < filter-name >monitoring</ filter-name > < filter-class >net.bull.javamelody.MonitoringFilter</ filter-class > </ filter > < filter-mapping > < filter-name >monitoring</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < listener > < listener-class >net.bull.javamelody.SessionListener</ listener-class > </ listener > < filter > < filter-name >encodingFilter</ filter-name > < filter-class >org.springframework.web.filter.CharacterEncodingFilter</ filter-class > < init-param > < param-name >encoding</ param-name > < param-value >UTF-8</ param-value > </ init-param > < init-param > < param-name >forceEncoding</ param-name > < param-value >true</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >encodingFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < listener > < listener-class >org.springframework.security.web.session.HttpSessionEventPublisher</ listener-class > </ listener > < filter > < filter-name >httpMethodFilter</ filter-name > < filter-class >org.springframework.web.filter.HiddenHttpMethodFilter</ filter-class > </ filter > < filter-mapping > < filter-name >httpMethodFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < filter > < filter-name >multipartFilter</ filter-name > < filter-class >org.springframework.web.multipart.support.MultipartFilter</ filter-class > </ filter > < filter-mapping > < filter-name >multipartFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < filter > < filter-name >springSecurityFilterChain</ filter-name > < filter-class >org.springframework.web.filter.DelegatingFilterProxy</ filter-class > </ filter > < filter-mapping > < filter-name >springSecurityFilterChain</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < filter > < filter-name >sitemesh</ filter-name > < filter-class >com.opensymphony.sitemesh.webapp.SiteMeshFilter</ filter-class > </ filter > < filter-mapping > < filter-name >sitemesh</ filter-name > < url-pattern >/*</ url-pattern > < dispatcher >REQUEST</ dispatcher > < dispatcher >FORWARD</ dispatcher > </ filter-mapping > < listener > < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > </ listener > < servlet > < servlet-name >action</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < init-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:config/spring/servlet-mvc.xml</ param-value > </ init-param > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >action</ servlet-name > < url-pattern >/</ url-pattern > </ servlet-mapping > </ web-app > |