问题描述
本人今天开始学习DWR,按照参考书上做了一个Hello Name的例子,有三点不明白的地方。1.我在jsp页面引用<script type="text/javascript" src="dwr/interface/service.js"></script>这个service.js是哪里来的(当然了,我知道是自动生成的,但是这个东西放在哪里?)2.我按照书上的说明将engine.js和util.js两个js文件放置在工程目录下的jscript文件夹里,并在jsp页面引用<script type="text/javascript" src="jscript/engine.js"></script><script type="text/javascript" src="jscript/util.js"></script>结果报错:A request has been denied as a potential CSRF attack.3.我通过网上的方法,网上提供两种方法, 我只用第二种简单的,就是将jscript/engine.js和jscript/util.js改为:dwr/engine.js和dwr/util.js(也就是更改了js文件存放的目录),结果可以运行,但是我就郁闷了,dwr这个目录以及里面的js文件根本不存在啊,并且我在浏览器里输入:http://10.81.66.173/dwr_1/dwr/engine.js它又弹出engine.js的文件下载框,说明存在该文件,但是明明我找不到啊,自动生成的也应该至少存在把。怎么隐身了啊。在这里跟大家交个朋友,请大家帮我看看是什么原因。 问题补充:恩,谢谢大家,我找到原因了,我把源码拿过来看了一下,果然是从自带的包里面把js读出来。。。 public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException { if (dynamic) { response.setHeader("pragma", "public"); response.setHeader("Expires", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); } if (!dynamic && isUpToDate(request)) { response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); return; } String output; synchronized (scriptCache) { output = (String) scriptCache.get(filePath); if (output == null) { StringBuffer buffer = new StringBuffer(); String resource = DwrConstants.PACKAGE + filePath; InputStream raw = getClass().getResourceAsStream(resource); if (raw == null) { throw new IOException("Failed to find resource: " + resource); } BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(raw)); while (true) { String line = in.readLine(); if (line == null) { break; } if (dynamic) { if (line.indexOf(PARAM_SCRIPT_COOKIENAME) != -1) { line = LocalUtil.replace(line, PARAM_SCRIPT_COOKIENAME, sessionCookieName); } if (line.indexOf(PARAM_SCRIPT_POLLXHR) != -1) { line = LocalUtil.replace(line, PARAM_SCRIPT_POLLXHR, pollWithXhr); } if (line.indexOf(PARAM_SCRIPT_SESSIONID) != -1) { line = LocalUtil.replace(line, PARAM_SCRIPT_SESSIONID, generator.generateId(pageIdLength)); } if (line.indexOf(PARAM_SCRIPT_ALLOWGET) != -1) { line = LocalUtil.replace(line, PARAM_SCRIPT_ALLOWGET, String.valueOf(allowGetForSafariButMakeForgeryEasier)); } if (line.indexOf(PARAM_SCRIPT_TAG_PROTECTION) != -1) { line = LocalUtil.replace(line, PARAM_SCRIPT_TAG_PROTECTION, scriptTagProtection); } if (line.indexOf(PARAM_DEFAULT_PATH) != -1) { String path = request.getContextPath() + request.getServletPath(); if (overridePath != null) { path = overridePath; } line = LocalUtil.replace(line, PARAM_DEFAULT_PATH, path); } } buffer.append(line); buffer.append('n'); } } finally { LocalUtil.close(in); } output = buffer.toString(); if (mimeType.equals(MimeConstants.MIME_JS) && scriptCompressed) { output = JavascriptUtil.compress(output, compressionLevel); } if (!dynamic) { scriptCache.put(filePath, output); } } } response.setContentType(mimeType); response.setDateHeader(HttpConstants.HEADER_LAST_MODIFIED, servletContainerStartTime); response.setHeader(HttpConstants.HEADER_ETAG, etag); PrintWriter out = response.getWriter(); out.println(output); }
解决方案
这两个js是确实存在的,你浏览器输入的地址只是网络映射地址,而这两个js实际是放在dwr.jar包里面的,是通过org.directwebremoting.servlet.DwrServlet解析的,因为这个servlet拦截的就是/dwr/*的地址。
解决方案二:
补充一点,楼主可以参照官方发布的一个简单例子,如果可以阅读简单英文的话,那就更容易入门了!!!http://directwebremoting.org/dwr/introduction/getting-started.html
解决方案三:
引用2.我按照书上的说明将engine.js和util.js两个js文件放置在工程目录下的jscript文件夹里,并在jsp页面引用-- 关于这点,我不理解!因为现在的DWR并不存在这两个js文件在web.xml中,我们作如下配置:<servlet-mapping><servlet-name>dwr-invoker</servlet-name><url-pattern>/dwr/*</url-pattern></servlet-mapping>这意味着,不管是dwr/interface/service.js,还是dwr/engine.js,其最终都是交给dwr-invoker(这里指org.directwebremoting.servlet.DwrServlet)处理。我觉得楼主是纠结于为什么请求路径中包含后缀名是*.js,而实际上不存在engine.js的javascript文件这一问题吧!!举个例子,我们创建一个Servlet(可以输出“hello”),然后在web.xml中作如下配置:<servlet-mapping><servlet-name>myServlet</servlet-name><url-pattern>/main.html</url-pattern></servlet-mapping><servlet-mapping><servlet-name>myServlet</servlet-name><url-pattern>/main.js</url-pattern></servlet-mapping>这样,不管你在浏览器中输入http://localhost/main.html,或是http://localhost/main.js,最终都是输出“hello”