Параметр сервлета tomcat 8.5: webappBasePath - PullRequest
0 голосов
/ 12 июня 2018

У меня есть веб-приложение, содержащее пару сервлетов, и один сервлет делает предположение о init-параметре webappBasePath в ServletConfig.Я понятия не имею, как это установить, но более старые версии (например, протестированные на tomcat 5 на хосте centos 5) tomcat5-5.5.23-0jpp.40.el5_9 добавили './' к webappBasePath, в то время как более новые версии, похоже, этого не делают.( РЕДАКТИРОВАТЬ: К переменной не добавляется «./», приведенный ниже код вызывает ServletContext.getRealPath() к настройке по умолчанию «.», И разные версии tomcat обрабатывают вещи по-разному)

Я добавил новый сервлет в WEB-INF / web.xml:

    <servlet>
        <servlet-name>TKServlet</servlet-name>
        <servlet-class>servlets.TKServlet</servlet-class>

    </servlet>

    <servlet-mapping>
        <servlet-name>TKServlet</servlet-name>
        <url-pattern>/tkservlet</url-pattern>
    </servlet-mapping>

TKServlet.java

package ImageGenerator;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import java.io.*;

public class TKServlet extends HttpServlet {
    private static final long serialVersionUID = 9830958231344L;

    private static String webappBasePath = ".";

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        if (config.getInitParameter("webappBasePath") != null) {
            webappBasePath = config.getInitParameter("webappBasePath");
            System.err.println("init-param 'webappBasePath' = " + webappBasePath);
        }
        webappBasePath = config.getServletContext()
                             .getRealPath(webappBasePath) + "/";
        System.err.println("getRealPath(webappBasePath) = " + webappBasePath);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
        response.setContentType("text/ascii");
        PrintWriter out = response.getWriter();
        out.println("Here is some response doc.");
        out.println("webappBasePath is: " + webappBasePath);
    }
}

Журналы с tomcat5: http://localhost:8080/myapp/tkservlet

catalina.out:

getRealPath(webappBasePath) = /usr/share/tomcat5/webapps/XSLT_HIQ/./

Войдите в систему tomcat8.5:

getRealPath(webappBasePath) = /adtech/tomcat/webapps/XSLT_HIQ/

Вопрос: Где находитсянабор webappBasePath и как я могу его изменить?

1 Ответ

0 голосов
/ 12 июня 2018

Нашел ответ: наверное, я просто запутался.Пожалуйста, посмотрите мой ответ, если вы заинтересованы.

В журналах catalina.out показано, что init-параметр webappBasePath вообще не задан: если бы он был, то было бы: init-param 'webappBasePath' = <something> сообщениев catalina.out файле журнала.

Следует отметить, что выходные данные ServletContext.getRealPath() отличаются между версиями Tomcat, я думаю, это ошибка в моем коде сервлета.

Конечно, его можно установить с помощью <init-params> в файле WEB-INF/web.xml.

Я добавил (внутри тега <servlet>):

     <init-param>
        <param-name>webappBasePath</param-name>
        <param-value>/var/tmp/somewebapp/files/./</param-value>
     </init-param>
</servlet>

tomcat 5 log show

init-param 'webappBasePath' = /var/tmp/somewebapp/files/./
getRealPath(webappBasePath) = /usr/share/tomcat5/webapps/XSLT_HIQ/var/tmp
                                  /somewebapp/files/./

tomcat8.5 log

init-param 'webappBasePath' = /var/tmp/somewebapp/files/./
getRealPath(webappBasePath) = /adtech/tomcat/webapps/XSLT_HIQ/var/tmp
                                  /somewebapp/files//

NOTE ServletContext.getRealPath() на tomcat8.5 есть«нормализация» пути путем удаления компонента с одной точкой.

EDIT

Старые версии tomcat, в которых используется следующий код в ApplicationContext (пример из svntc5.0.x )

public String getRealPath(String path) {                                    
    // ...                                                                        
    File file = new File(basePath, path);                                   
    return (file.getAbsolutePath());                                        

}

В то время как более новые версии используют getRealPath от StandardContext (строки 4319-4349 здесь )

public String getRealPath(String path) {
    if (resources != null) {
        // ...
            WebResource resource = resources.getResource(path);
            String canonicalPath = resource.getCanonicalPath();
            // ...

                return canonicalPath;
            }
    // ...
}

веб-ресурс getCanonicalPath() звонит java.io.File#getCanonicalPath() который

удаляет избыточные имена, такие как '.'и '..' из пути

(скопировано из javadocs для файла # getCanonicalPath )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...