1. 程式人生 > >SpringMVC中設定靜態資源不被攔截的問題

SpringMVC中設定靜態資源不被攔截的問題

        這兩天使用SpringMVC來做登入,註冊的小demo,其中用到了springmvc攔截器對登入操作進行攔截處理,並對url進行驗證。

驗證通過則可以進行handler的處理,如果驗證不通過直接跳回或者重定向到指定的頁面。

        但是在做這個操作的時候,遇到很大的一個問題就是專案demo中的靜態資源都會在每次請求中被攔截處理了!跳回頁面的時候

頁面就不再是想想中的呈現的樣子了。

        以為我在springmvc.xml中已經配置了攔截器和靜態資源的配置卻還是出現這樣的結果,所以就又是看前段瀏覽器的設定,又是看

css檔案,js檔案。最後才鎖定目標是靜態資源的問題,直接在web.xml中使用defaultServlet的方式才解決問題。

      下面是我的攔截器程式碼:

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		String url=request.getRequestURI();
		System.out.println(url);
		String method=request.getMethod();
	        //判斷是否在做登入操作
		if(url.indexOf("/login")>=0&&method.equalsIgnoreCase("post")){
            	return true;
		}
                //判斷是否在做註冊操作
              if(url.indexOf("/toAddUserPage")>=0){
			return true;
		}
	       //如果時登入使用者則可以進行下一步操作  返回true
		HttpSession session=request.getSession();
		User user=(User) session.getAttribute("user");
		if(user!=null){
                           //登入之後不能使用登入操作和註冊操作
                          if(url.indexOf("/toLogin")>=0||url.indexOf("/toAddUserPage")>=0){
				request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request, response);
				return false;
			}
			return true;
		}
		//其他操作直接返回到登入頁面
		request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response);
		return false;
	}
下面是我的springmvc的配置:
<!-- 可以掃描controller、service、這裡讓掃描controller,指定controller的包 -->
	<context:component-scan base-package="com.ipro.shopping.controller"/>
        <!-- 使用 註解驅動可以載入處理器介面卡和處理器對映以及json直譯器不用單獨再新增處理器介面卡和核處理器對映的配置 -->
	<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
	
	<!-- 靜態資源解析包括 :js、css、img、 -->
	<!-- <MVC:RESOURCES LOCATION="/" MAPPING="**.HTML"/>
	<MVC:RESOURCES LOCATION="/" MAPPING="**.JS"/>
	<MVC:RESOURCES LOCATION="/" MAPPING="**.CSS"/>
	<MVC:RESOURCES LOCATION="/" MAPPING="**.PNG"/>
	<MVC:RESOURCES LOCATION="/" MAPPING="**.GIF"/>
	<MVC:RESOURCES LOCATION="/" MAPPING="**.JPG"/> -->
	
	<!-- 配置攔截器 -->
    <mvc:interceptors>
	   <mvc:interceptor>
	      <mvc:mapping path="/**"/>
	      <bean class="com.ipro.shopping.interceptor.LoginInterceptor"></bean>
	   </mvc:interceptor>
	</mvc:interceptors>
我把所有的靜態資源都設定成怎樣的形式,可結果還是無法返回正確的答案。

下面是配置web.xml之後的檔案:

<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.jpg</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.gif</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.js</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.css</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.png</url-pattern>
	</servlet-mapping>
	
	<!-- springmvc前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- contextConfigLocation配置springmvc載入的配置檔案 (配置處理器對映器、介面卡等等) 如果不配置contextConfigLocation, 
			預設載入的是/WEB-INF/servlet名稱-serlvet.xml(springmvc-servlet.xml) -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
	</servlet>
注意的是我們配置defaultServlet一定要配置到springmvc的前端控制器(DispatcherServlet)前面才會生效。

上面是我在做登入驗證的時候用到的,僅供參考。目前這個問題只做了一種方案,網上說的有三種可以解決的方案,第一種就是我上面提到的這種

第二種就是在springmvc中配置的方式,只不過我配置的沒有成功。另外一種就是也是使用defaultServlet使用註解的方式配置。

這兩種方式就留在以後在驗證吧,時間太晚,好睏啊!不寫啦,對不住啦!