SpringMVC中設定靜態資源不被攔截的問題
阿新 • • 發佈:2019-01-26
這兩天使用SpringMVC來做登入,註冊的小demo,其中用到了springmvc攔截器對登入操作進行攔截處理,並對url進行驗證。
驗證通過則可以進行handler的處理,如果驗證不通過直接跳回或者重定向到指定的頁面。
但是在做這個操作的時候,遇到很大的一個問題就是專案demo中的靜態資源都會在每次請求中被攔截處理了!跳回頁面的時候
頁面就不再是想想中的呈現的樣子了。
以為我在springmvc.xml中已經配置了攔截器和靜態資源的配置卻還是出現這樣的結果,所以就又是看前段瀏覽器的設定,又是看
css檔案,js檔案。最後才鎖定目標是靜態資源的問題,直接在web.xml中使用defaultServlet的方式才解決問題。
下面是我的攔截器程式碼:
下面是我的springmvc的配置:@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; }
我把所有的靜態資源都設定成怎樣的形式,可結果還是無法返回正確的答案。<!-- 可以掃描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使用註解的方式配置。
這兩種方式就留在以後在驗證吧,時間太晚,好睏啊!不寫啦,對不住啦!