JSP中的getServletContext()。getRealPath(“/”)中的未终止字符串文字

时间:2011-03-16 19:15:43

标签: javascript relative-path servlets

这是我在回答上一个问题后出现的错误。本质上我正试图带来文件夹的absPath,所以我可以在运行时制作一些文件,无论我的代码位于何处。我被建议使用

getServletContext().getRealPath("/");

找到正确的路径。

我在JSP页面中尝试过,但是在创建absPath变量时,我得到了一个未终止的字符串文字。这是我尝试运行的脚本。

<script type="text/javascript">
        var RemoteUserId = "<%=(request.getRemoteUser()==null)? "blah" : request.getRemoteUser()%>";
        var contextPath = "<%= request.getContextPath()%>";         
        var extPath = "<%=extPath%>";
        var absPath = "<%=getServletContext().getRealPath("/")%>";
        var env='<%=string1%>';
</script>

我错过了什么?我是否必须转义返回的路径名称,或者在我应该使用它时误解了。

编辑** 这是源在访问页面时显示的内容(稍微调整,所以我没有显示我的完整C:路径)

<script type="text/javascript">
        var RemoteUserId = "blah";
        var contextPath = "/TRACK";         
        var extPath = "http://xxx/sales/it/tlp/ext-3.2.1";
        var env='null';
        var absPath = "C:\Documents and Settings...\TRACK\";
</script>

1 个答案:

答案 0 :(得分:0)

与Java一样,反斜杠是JS中的转义字符。你需要逃避它们来代表一个字面反斜杠。换句话说,您的absPath变量必须最终为

var absPath = "C:\\Documents and Settings...\\TRACK\\";

你可以通过

来做到这一点
var absPath = "<%=getServletContext().getRealPath("/").replace("\\", "\\\\")%>";

但是,通过JavaScript将Java变量传递回Java是没有意义的。当代码即将处理请求时,只需在Java端访问它。想象一下,您正在使用servlet来处理请求,只需执行

String absPath = getServletContext().getRealPath("/");

而不是

String absPath = request.getParameter("absPath");

(或者您正在做的任何事情,以便在您的Java代码中重新获得absPath

另请注意,客户端的所有JavaScript代码都是完全可控/可欺骗/可攻击的。客户端能够在代码运行时编辑JavaScript变量。例如,客户端可以在使用之前更改路径。牢记这一点!