直接阅读index.html而不在网址

时间:2017-01-27 04:33:39

标签: java spring spring-mvc

我在以下结构中有一个index.html文件。

WEB-INF/dbName/type/id/index.html

此外,同一路径中还有外部css和js文件。

我需要访问此文件而不在浏览器中公开其路径。

以下是我的控制器类:

@Controller
public class MyController {

    private static final Logger logger = LoggerFactory.getLogger(MyController.class);

    @RequestMapping(value = "/{type}/{id}", method = RequestMethod.GET, produces = MediaType.ALL_VALUE)
    public String pod(HttpServletRequest request, @PathVariable String type, @PathVariable String id)
            throws IOException {
        String redirectUrl = "/dbName/" + type + "/" + id + "/index.html";
        return "redirect:" + redirectUrl;
    }
}

servlet-dispatcher.xml中的资源映射:

<mvc:resources mapping="/dbName/**" location="/WEB-INF/dbName/" />

生成的网址如下所示:localhost:8080/project/dbName/type/id/index.html

但是,预期的网址是:localhost:8080/project/type/id/

此代码公开浏览器中资源的URL。然后,我尝试使用转发而不是重定向。然后它不会公开URL,但不会加载index.html中使用的外部CSS和js。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

视图解析器的约定指定视图解析器可以返回null以指示无法找到视图。但是,并非所有视图解析器都这样做,因为在某些情况下,解析器根本无法检测视图是否存在。例如,InternalResourceViewResolver在内部使用RequestDispatcher,并且调度是确定JSP是否存在的唯一方法,但此操作只能执行一次。 VelocityViewResolver和其他一些同样适用。检查特定视图解析程序的javadoc,以查看它是否报告不存在的视图。因此,将一个InternalResourceViewResolver放在链中的最后一个位置会导致链未被完全检查,因为InternalResourceViewResolver将始终返回一个视图!

重定向到视图

  

如前所述,控制器通常会返回逻辑视图名称,视图解析器会将其解析为特定的视图技术。对于通过Servlet或JSP引擎处理的JSP等视图技术,此解决方案通常通过InternalResourceViewResolver和InternalResourceView的组合来处理,InternalResolver和InternalResourceView通过Servlet API的RequestDispatcher.forward(..)方法或RequestDispatcher发出内部转发或包含。 .include()方法。对于其他视图技术,例如Velocity,XSLT等,视图本身将内容直接写入响应流。

<强> RedirectView的

  

由于控制器响应而强制重定向的一种方法是控制器创建并返回Spring的RedirectView实例。在这种情况下,DispatcherServlet不使用普通的视图解析机制。而是因为它已经被赋予了(重定向)视图,DispatcherServlet只是指示视图完成其工作。 RedirectView依次调用HttpServletResponse.sendRedirect()将HTTP重定向发送到客户端浏览器。

如果您使用RedirectView并且视图是由控制器本身创建的,则建议您将重定向URL配置为注入控制器,以便它不会被烘焙到控制器中,而是在上下文中与视图一起配置名。名为“重定向:前缀”的部分促进了这种解耦。

重定向:前缀

  

虽然RedirectView的使用工作正常,但如果控制器本身创建RedirectView,则无法避免控制器意识到重定向正在发生的事实。这实际上并不是最理想的,而是将事情过于紧密。控制器不应该真正关心如何处理响应。一般来说,它应该只根据注入的视图名称进行操作。

特殊重定向:前缀允许您完成此操作。如果返回的视图名称具有前缀redirect:,则UrlBasedViewResolver(以及所有子类)会将此识别为需要重定向的特殊指示。视图名称的其余部分将被视为重定向URL。

净效果与控制器返回RedirectView的效果相同,但现在控制器本身可以简单地按逻辑视图名称操作。逻辑视图名称(例如redirect:/ myapp / some / resource)将相对于当前Servlet上下文重定向,而重定向:http://myhost.com/some/arbitrary/path等名称将重定向到绝对URL。

转发:前缀

  

也可以为最终由UrlBasedViewResolver和子类解析的视图名称使用特殊的forward:前缀。这会创建一个InternalResourceView(最终会对视图名称的其余部分执行RequestDispatcher.forward()),该视图名称被视为URL。因此,此前缀对于InternalResourceViewResolver和InternalResourceView(例如对于JSP)没有用。但是,当您主要使用其他视图技术时,前缀可能会有所帮助,但仍希望强制Servlet / JSP引擎处理资源的转发。 (请注意,您也可以链接多个视图解析器。)

     

与redirect:前缀一样,如果带有forward:前缀的视图名称被注入控制器,则控制器不会检测到在处理响应方面发生任何特殊情况。

DOCS:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

答案 1 :(得分:1)

RequestDispatcher类和它提到的前向方法应该有效。

RequestDispatcher rd = req.getRequestDispatcher("index.html");
rd.forward(req, resp);

这应该直接为index.html页面提供服务,而不是直接访问它。

令人困惑的是,为什么CSS和JS无法使用此方法。我不认为请求/index.html或使用servlet请求index.html导致这种情况有什么不同。也许检查一下HTML中是否正确引用了这些文件?

我知道这会更适合评论,但我还没有赢得足够的声誉,抱歉。

答案 2 :(得分:1)

重定向首先将网址发送回浏览器,然后从浏览器发送另一个请求,重定向可以重定向到不同服务器上的资源。
由于带有重定向操作的URL被发送回浏览器,导致浏览器在客户端的地址栏中显示URL

只需使用

request.getRequestDispathcer("url").forward(//required params);

转发请求用于转发到进行呼叫的服务器中可用的资源。这种控制转移由容器内部完成,不涉及浏览器/客户端。