Springboot访问静态资源源码解析

Springboot中访问静态资源也是通过DispatcherServlet。与访问方法请求一样也是走的这个方法:

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

不过使用的handlerAdapter类是HttpRequestHandlerAdapter.在上面mapperHandler.getHandler()方法中获取的handler是ResourceHttpRequestHandler类然后进入其方法:

	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// For very general mappings (e.g. "/") we need to check 404 first
		Resource resource = getResource(request);
	@Override
	@Nullable
	public Resource resolveResource(
			@Nullable HttpServletRequest request, String requestPath, List<? extends Resource> locations) {

		ResourceResolver resolver = getNext();
		if (resolver == null) {
			return null;
		}

		try {
			return resolver.resolveResource(request, requestPath, locations, this);
		}
		finally {
			this.index--;
		}
	}
在resolver.resolveResource(request, requestPath, locations, this);方法中使用的是PathResourceResolver类,然后进入了其getResource()方法:
	@Nullable
	private Resource getResource(String resourcePath, @Nullable HttpServletRequest request,
			List<? extends Resource> locations) {

		for (Resource location : locations) {
			try {
				if (logger.isTraceEnabled()) {
					logger.trace("Checking location: " + location);
				}
				String pathToUse = encodeIfNecessary(resourcePath, request, location);
				Resource resource = getResource(pathToUse, location);

locations是resources下面的路径,有5个,分别是:/META-INF/resources,resources,/static, /public,以及一个ServletContext获取的路径,也是在resources文件夹下面,如果我们的静态文件在上面四个地址,可以通过http请求直接访问,同时通过ServletContext类也可以访问到resources文件夹下面的文件。

同时Springboot还提供了一个访问jar文件的路径:具有路径的任何资源 /webjars/**都是从jar文件提供的



猜你喜欢

转载自blog.csdn.net/lz710117239/article/details/80978925
今日推荐