首先,关于静态资源不能访问,开始原以为无非就是在spring-mvc的配置文件里面加入<mvc:default-servlet-handler/>  和<mvc:annotation-driven />,其中<mvc:default-servlet-handler/>就是处理静态资源的。但是今天,我的项目出现了所有页面的静态资源都不能访问的情况。首先先看看web.xml中的一段配置

        <servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springmvc-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<!-- <url-pattern>*.htm</url-pattern>
		<url-pattern>*.do</url-pattern> -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

这里会拦截所有的请求,想要访问静态资源要在spring-mvc的配置文件里面加入<mvc:default-servlet-handler/>  和<mvc:annotation-driven />。都加了,但是今天问题还不能解决。于是就继续找。我开始的时候在spring-mvc中配置了两个拦截器

        <mvc:interceptors>
		<bean id="loginInterceptor" class="com.atguigu.atcrowdfunding.interceptor.LoginInterceptor"></bean>
		 <bean id="authorInterceptor" class="com.atguigu.atcrowdfunding.interceptor.AuthorInterceptor"></bean> 
	</mvc:interceptors>

这两个拦截器也会拦截所有的请求。包括静态资源,这次出错的地方主要在LoginInterceptor

package com.atguigu.atcrowdfunding.interceptor;

import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler;

import com.atguigu.atcrowdfunding.bean.User;
import com.atguigu.atcrowdfunding.util.Const;

public class LoginInterceptor extends HandlerInterceptorAdapter{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		
		
		Set<String> publicResourceSet = new HashSet<String>();//公共资源,白名单,直接放行
		publicResourceSet.add("/login");
		publicResourceSet.add("/regist");
		publicResourceSet.add("/index");
		publicResourceSet.add("/registUser");
		publicResourceSet.add("/loginUser");
		publicResourceSet.add("/checkLoginacct");
		
		
		String servletPath = request.getServletPath();
		
		if(publicResourceSet.contains(servletPath)) {
			return true;
		}
		
		HttpSession session = request.getSession();
		
		User user = (User) session.getAttribute(Const.LOGIN_USER);
		
		if(user!=null) {
			return true;//放行
		}else {
			response.sendRedirect(request.getContextPath()+"/login");
			return false;
		}
		
	}
}

在这里,这个拦截器也要拦截一些请求,如果属于静态资源,就会走return false,不会放行,所有,静态资源一直访问不到。所以只有在拦截器中加入判断是否为静态资源,若为静态资源,让他放行,就可以了。

if(handler instanceof DefaultServletHttpRequestHandler) {
			return true;
		}
其中 DefaultServletHttpRequestHandler为默认的静态资源的Handler,所以放行就可以了。

困扰了一天了。。。。


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐