2017-01-12 69 views
7

Jesteśmy przy użyciu JBoss 7.1.3.Final z Java 6. Chciałbym zastosować kodowanie UTF-8 stron do wszystkich stron JSP podawane na naszej stronie, więc dodałem to do naszego pliku web.xmlJak określić, że chcę, aby moja dyrektywa jsp-config była stosowana do wszystkich stron JSP obsługiwanych przez naszą aplikację?

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>/*</url-pattern> 
     <page-encoding>UTF-8</page-encoding> 
    </jsp-property-group> 
</jsp-config> 

, co powoduje błąd poniżej.

Message: 
java.lang.StringIndexOutOfBoundsException: String index out of range: 0 

StackTrace: 
org.apache.jasper.JasperException: java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:581) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:397) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:402) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:346) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) 
    at org.owasp.csrfguard.CsrfGuardFilter.doFilter(CsrfGuardFilter.java:63) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) 
    at io.undertow.jsp.JspFileHandler.handleRequest(JspFileHandler.java:32) 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) 
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) 
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) 
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72) 
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) 
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284) 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263) 
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) 
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174) 
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:198) 
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:784) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(String.java:658) 
    at org.apache.jasper.compiler.JspUtil.makeJavaIdentifier(JspUtil.java:830) 
    at org.apache.jasper.compiler.JspUtil.makeJavaIdentifier(JspUtil.java:803) 
    at org.apache.jasper.JspCompilationContext.getServletClassName(JspCompilationContext.java:399) 
    at org.apache.jasper.JspCompilationContext.getClassFileName(JspCompilationContext.java:580) 
    at org.apache.jasper.compiler.Compiler.isOutDated(Compiler.java:438) 
    at org.apache.jasper.compiler.Compiler.isOutDated(Compiler.java:406) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:645) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:358) 
    ... 69 more 

Chociaż nasze strony są przechowywane w następujących ścieżkach plików ...

project/src/main/webapp/WEB-INF/views/folder1/index.jsp 

Nasze wzorce URL nie kończy się .jsp. W rzeczywistości są to tylko słowa (np. "/ Folder1/indeks"). Jednak po wypróbowaniu tej dyrektywy moja aplikacja nie została uruchomiona po ponownym uruchomieniu serwera. W jaki sposób określamy, że chcemy, aby dyrektywa była stosowana do wszystkich stron JSP dostarczanych z naszej witryny?

+0

pomyślałem "* .jsp" wzory mają zastosowanie tylko do adresów URL, które kończą się "* .jsp". Chociaż pliki mają nazwę ".jsp" w moim systemie plików, adresy URL, które ostatecznie wywołują te, nie są (są to po prostu słowa, takie jak "/ dir1/path1"). ".jsp" miałby zastosowanie do adresów URL, które nie kończą się na ".jsp" .jsp "? – Dave

+0

odsyłają to https://developer.jboss.org/thread/265872 – gladiator

+0

Specyfikacja JSP (2.3) mówi, że powinieneś używać wzorców adresów URL, które są zgodne z JSP, ale nie jest jasne, w jaki sposób koliduje to z serwletem. Musisz mieć pewne dyrektywy dotyczące mapowania serwletów, czy nie, ponieważ twoje strony JSP nie mają nazwy o nazwie .jsp. – gsl

Odpowiedz

0

za pomocą filtra można zastosować kodowanie strony.

public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
      request.setCharacterEncoding(encoding); 
    //    response.setContentType("text/html;charset=UTF-8"); 
        response.setCharacterEncoding(encoding); 
      filterChain.doFilter(request, response); 

     } 

     public void init(FilterConfig filterConfig) throws ServletException { 
      String encodingParam = filterConfig.getInitParameter("encoding"); 
      if (encodingParam != null) { 
       encoding = encodingParam; 
      } 
     } 

Rejestr ten filtr w web.xml

+0

Dzięki, ale odpowiadając na pytanie, jak napisać wzorzec adresu URL, który dotyczy wszystkich adresów URL, podając "/* "wydaje się nie działać? – Dave