『壹』 servlet filter和springMVC攔截器的區別
在struts2中用過filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢?
一、定義
攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
過濾器:是在javaweb中,你傳入的request、response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字元集,或者去除掉一些非法字元.。
二、xml文件配置
1.filter
該過濾器的方法是創建一個類XXXFilter實現此介面,並在該類中的doFilter方法中聲明過濾規則,然後在配置文件web.xml中聲明他所過濾的路徑
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Interceptor
它也要實現HandlerInterceptor 介面,這里只介紹方法註解配置
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、具體區別
filter
Interceptor
多個的執行順序
根據filter mapping配置的先後順序
按照配置的順序,但是可以通過order控制順序
規范
在Servlet規范中定義的,是Servlet容器支持的
Spring容器內的,是Spring框架支持的。
使用范圍
只能用於Web程序中
既可以用於Web程序,也可以用於Application、Swing程序中。
深度
Filter在只在Servlet前後起作用
攔截器能夠深入到方法前後、異常拋出前後等
四、總結
兩者的本質區別:攔截器是基於java的反射機制的,而過濾器是基於函數回調。從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。
『貳』 SpringMVC 攔截器問題
mvc:exclude-mapping 標簽不被spring-mvc-3.0.xsd支持,該配置在spring-mvc-3.2.xsd中,可以通過http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd獲取,因此需要在spring-mvc-3.0.xsd文件中增加該標簽,處理辦法很簡單,從網上下載spring-mvc-3.2.xsd,找到標簽後,再找到spring.web.servlet-3.0.5.jar中的spring-mvc-3.0.xsd文件,將標簽加入即可
『叄』 springmvc怎麼在攔截頁面
一、我們都知道在基於Spring的Application中,需要在web.xml中增加下面類似的配置信息:
此處需要特別強調的是 /使用的是/,而不是/*,如果使用/*,那麼請求時可以通過DispatcherServlet轉發到相應的Action或者Controller中的,但是返回的內容,如返回的jsp還會再次被攔截,這樣導致404錯誤,即訪問不到jsp。所以如果以後發現總是有404錯誤的時候,別忘了check一下 /的配置是否是/*.
二、其實Spring 的Servlet攔截器匹配規則(即 ... )都可以自己定義,例:當映射為@RequestMapping("/user/add")時
1、攔截*.do、*.htm, 例如:/user/add.do
這是最傳統的方式,最簡單也最實用。不會導致靜態文件(jpg,js,css)被攔截。
2、攔截/,例如:/user/add
可以實現現在很流行的REST風格。很多互聯網類型的應用很喜歡這種風格的URL。
弊端:會導致靜態文件(jpg,js,css)被攔截後不能正常顯示。想實現REST風格,事情就是麻煩一些。後面有解決辦法還算簡單。
3、攔截/*,這是一個錯誤的方式,請求可以走到Action中,但轉到jsp時再次被攔截,不能訪問到jsp。
三、如何訪問到靜態的文件,如jpg,js,css?
如果你的DispatcherServlet攔截"*.do"這樣的有後綴的URL,就不存在訪問不到靜態資源的問題。
如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態文件的訪問也就被攔截了。
我們要解決這個問題。
目的:可以正常訪問靜態文件,不可以找不到靜態文件報404。
方案一:激活Tomcat的defaultServlet來處理靜態文件
特點:1. 要配置多個,每種文件配置一個。
2. 要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截請求,這樣請求就不會進入Spring了。
3. 高性能。
備註:
Tomcat, Jetty, JBoss, and GlassFish 自帶的默認Servlet的名字 -- "default"
Google App Engine 自帶的 默認Servlet的名字 -- "_ah_default"
Resin 自帶的 默認Servlet的名字 -- "resin-file"
WebLogic 自帶的 默認Servlet的名字 -- "FileServlet"
WebSphere 自帶的 默認Servlet的名字 -- "SimpleFileServlet"
方案二: 在spring3.0.4以後版本提供了mvc:resources , 使用方法:
images/**映射到 ResourceHttpRequestHandler進行處理,location指定靜態資源的位置.可以是web application根目錄下、jar包裡面,這樣可以把靜態資源壓縮到jar包中。cache-period 可以使得靜態資源進行web cache
如果出現下面的錯誤,可能是沒有配置的原因。
報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
使用元素,把mapping的URI注冊到SimpleUrlHandlerMapping的urlMap中,
key為mapping的URI pattern值,而value為ResourceHttpRequestHandler,
這樣就巧妙的把對靜態資源的訪問由HandlerMapping轉到ResourceHttpRequestHandler處理並返回,所以就支持classpath目錄,jar包內靜態資源的訪問.
另外需要注意的一點是,不要對SimpleUrlHandlerMapping設置defaultHandler.因為對static uri的defaultHandler就是ResourceHttpRequestHandler,
否則無法處理static resources request.
方案三 ,使用
會把"/**" url,注冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到 org.springframework.web.servlet.resource. 處理並返回.
使用就是各個Servlet容器自己的默認Servlet.
補充說明:多個HandlerMapping的執行順序問題:
的order屬性值是:0
<<SPAN class="Apple-converted-space"> mvc:resources/ > 自動注冊的 SimpleUrlHandlerMapping 的order屬性值是: 2147483646
自動注冊 的SimpleUrlHandlerMapping 的order屬性值是: 2147483647
spring會先執行order值比較小的。當訪問一個a.jpg圖片文件時,先通過 來找處理器,一定是找不到的,因為我們沒有叫a.jpg的Action。然後再按order值升序找,由於最後一個 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定會匹配上,就可以響應圖片。 訪問一個圖片,還要走層層匹配。不知性能如何?
最後再說明一下,方案二、方案三 在訪問靜態資源時,如果有匹配的(近似)總攔截器,就會走攔截器。如果你在攔截中實現許可權檢查,要注意過濾這些對靜態文件的請求。
如何你的DispatcherServlet攔截 *.do這樣的URL後綴,就不存上述問題了。還是有後綴方便。
『肆』 SpringMVC框架,controller層返回頁面不能訪問靜態資源的問題。
如果你的spring-mvc配置了請求攔截器,那你可以用轉發的方法跳轉到你想要的頁面,這是請求攔截:
『伍』 springMVC的攔截器不攔截直接訪問jsp的請求
你好,分享一下我的攔截器,多多指教,代碼如下:
在spring的配置文件裡面進行配置攔截器
<!-- 攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 對所有的請求攔截使用/**-->
<mvc:mapping path="/**" />
<ref bean="userAccessInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="userAccessInterceptor"class="com.web.interceptor.UserAccessInterceptor"></bean>
攔截器如下設置,當用戶未登錄時,返回到登錄頁面
class UserAccessInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
//靜態資源直接return true
if(handler instanceof ResourceHttpRequestHandler){
return true;
}
if(Utils.isNull(UserCookie.getApploginUserId())){
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
return true;
}
『陸』 Spring中攔截/和攔截/*的區別
一、我們都知道在基於Spring的Application中,需要在web.xml中增加下面類似的配置信息:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Spring MVC Servlet -->
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
此處需要特別強調的是 <url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那麼請求時可以通過DispatcherServlet轉發到相應的Action或者Controller中的,但是返回的內容,如返回的jsp還會再次被攔截,這樣導致404錯誤,即訪問不到jsp。所以如果以後發現總是有404錯誤的時候,別忘了check一下 <url-pattern>/</url-pattern>的配置是否是/*.
二、其實Spring 的Servlet攔截器匹配規則(即 <url-pattern>...</url-pattern> )都可以自己定義,例:當映射為@RequestMapping("/user/add")時
1、攔截*.do、*.htm, 例如:/user/add.do
這是最傳統的方式,最簡單也最實用。不會導致靜態文件(jpg,js,css)被攔截。
2、攔截/,例如:/user/add
可以實現現在很流行的REST風格。很多互聯網類型的應用很喜歡這種風格的URL。
弊端:會導致靜態文件(jpg,js,css)被攔截後不能正常顯示。想實現REST風格,事情就是麻煩一些。後面有解決辦法還算簡單。
3、攔截/*,這是一個錯誤的方式,請求可以走到Action中,但轉到jsp時再次被攔截,不能訪問到jsp。
三、如何訪問到靜態的文件,如jpg,js,css?
如果你的DispatcherServlet攔截"*.do"這樣的有後綴的URL,就不存在訪問不到靜態資源的問題。
如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態文件的訪問也就被攔截了。
我們要解決這個問題。
目的:可以正常訪問靜態文件,不可以找不到靜態文件報404。
方案一:激活Tomcat的defaultServlet來處理靜態文件
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</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>
特點:1. 要配置多個,每種文件配置一個。
2. 要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截請求,這樣請求就不會進入Spring了。
3. 高性能。
備註:
Tomcat, Jetty, JBoss, and GlassFish 自帶的默認Servlet的名字 -- "default"
Google App Engine 自帶的 默認Servlet的名字 -- "_ah_default"
Resin 自帶的 默認Servlet的名字 -- "resin-file"
WebLogic 自帶的 默認Servlet的名字 -- "FileServlet"
WebSphere 自帶的 默認Servlet的名字 -- "SimpleFileServlet"
方案二: 在spring3.0.4以後版本提供了mvc:resources , 使用方法:
<!-- 對靜態資源文件的訪問 -->
<mvc:resources mapping="/images/**" location="/images/" />
images/**映射到 ResourceHttpRequestHandler進行處理,location指定靜態資源的位置.可以是web application根目錄下、jar包裡面,這樣可以把靜態資源壓縮到jar包中。cache-period 可以使得靜態資源進行web cache
如果出現下面的錯誤,可能是沒有配置<mvc:annotation-driven />的原因。
報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'使用<mvc:resources/>元素,把mapping的URI注冊到SimpleUrlHandlerMapping的urlMap中,
key為mapping的URI pattern值,而value為ResourceHttpRequestHandler,
這樣就巧妙的把對靜態資源的訪問由HandlerMapping轉到ResourceHttpRequestHandler處理並返回,所以就支持classpath目錄,jar包內靜態資源的訪問.
另外需要注意的一點是,不要對SimpleUrlHandlerMapping設置defaultHandler.因為對static uri的defaultHandler就是ResourceHttpRequestHandler,
否則無法處理static resources request.
方案三 ,使用<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
會把"/**" url,注冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到 org.springframework.web.servlet.resource. 處理並返回.
使用就是各個Servlet容器自己的默認Servlet.
補充說明:多個HandlerMapping的執行順序問題:
的order屬性值是:0
< mvc:resources/ > 自動注冊的 SimpleUrlHandlerMapping 的order屬性值是: 2147483646
<mvc:default-servlet-handler/>自動注冊 的SimpleUrlHandlerMapping 的order屬性值是: 2147483647
spring會先執行order值比較小的。當訪問一個a.jpg圖片文件時,先通過 來找處理器,一定是找不到的,因為我們沒有叫a.jpg的Action。然後再按order值升序找,由於最後一個 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定會匹配上,就可以響應圖片。 訪問一個圖片,還要走層層匹配。不知性能如何?
最後再說明一下,方案二、方案三 在訪問靜態資源時,如果有匹配的(近似)總攔截器,就會走攔截器。如果你在攔截中實現許可權檢查,要注意過濾這些對靜態文件的請求。
如何你的DispatcherServlet攔截 *.do這樣的URL後綴,就不存上述問題了。還是有後綴方便。
『柒』 springmvc有哪些攔截器
1.DispatcherServlet
SpringMVC具有統一的入口DispatcherServlet,所有的請求都通過DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據某某規則分發到目標Controller來處理。 所以我們現在web.xml中加入以下配置:
[html]view plainprint?
<!--初始化DispatcherServlet時,該框架在web應用程序WEB-INF目錄中尋找一個名為[servlet-名稱]-servlet.xml的文件,
並在那裡定義相關的Beans,重寫在全局中定義的任何Beans-->
<servlet>
<servlet-name>springMybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMybatis</servlet-name>
<!--所有的的請求,都會被DispatcherServlet處理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.靜態資源不攔截
如果只配置攔截類似於*.do格式的url,則對靜態資源的訪問是沒有問題的,但是如果配置攔截了所有的請求(如我們上面配置的「/」),就會造成js文件、css文件、圖片文件等靜態資源無法訪問。
一般實現攔截器主要是為了許可權管理,主要是攔截一些url請求,所以不對靜態資源進行攔截。要過濾掉靜態資源一般有兩種方式,
第一種是採用<mvc:default-servlet-handler />,(一般Web應用伺服器默認的Servlet名稱是"default",所以這里我們激活Tomcat的defaultServlet來處理靜態文件,在web.xml里配置如下代碼即可:)
[html]view plainprint?
<!--該servlet為tomcat,jetty等容器提供,將靜態資源映射從/改為/static/目錄,如原來訪問http://localhost/foo.css,現在http://localhost/static/foo.css-->
<!--不攔截靜態文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
</servlet-mapping>
Tomcat, Jetty, JBoss, and GlassFish 默認 Servlet的名字 -- "default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字 -- "FileServlet"
WebSphere 默認 Servlet的名字 -- "SimpleFileServlet"
如果你所有的Web應用伺服器的默認Servlet名稱不是"default",則需要通過default-servlet-name屬性顯示指定:
[html]view plainprint?
<mvc:default-servlet-handlerdefault-servlet-name="所使用的Web伺服器默認使用的Servlet名稱"/>
第二種是採用<mvc:resources />,在springmvc的配置文件中加入以下代碼:
[html]view plainprint?
<mvc:resourcesmapping="/js/**"location="/static_resources/javascript/"/>
<mvc:resourcesmapping="/styles/**"location="/static_resources/css/"/>
<mvc:resourcesmapping="/images/**"location="/static_resources/images/"/>
3.自定義攔截器
SpringMVC的攔截器HandlerInterceptorAdapter對應提供了三個preHandle,postHandle,afterCompletion方法。preHandle在業務處理器處理請求之前被調用,
postHandle在業務處理器處理請求執行完成後,生成視圖之前執行,afterCompletion在DispatcherServlet完全處理完請求後被調用,可用於清理資源等 。所以要想實現自己的許可權管理邏輯,需要繼承HandlerInterceptorAdapter並重寫其三個方法。
首先在springmvc.xml中加入自己定義的攔截器我的實現邏輯CommonInterceptor,
[html]view plainprint?
<!--配置攔截器,多個攔截器,順序執行-->
<mvc:interceptors>
<mvc:interceptor>
<!--匹配的是url路徑,如果不配置或/**,將攔截所有的Controller-->
<mvc:mappingpath="/"/>
<mvc:mappingpath="/user/**"/>
<mvc:mappingpath="/test/**"/>
<beanclass="com.alibaba.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
<!--當設置多個攔截器時,先按順序調用preHandle方法,然後逆序調用每個攔截器的postHandle和afterCompletion方法-->
</mvc:interceptors>
我的攔截邏輯是「在未登錄前,任何訪問url都跳轉到login頁面;登錄成功後跳轉至先前的url」,具體代碼如下:
[java]view plainprint?
/**
*
*/
packagecom.alibaba.interceptor;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.web.servlet.ModelAndView;
importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;
importcom.alibaba.util.RequestUtil;
/**
*@authortfj
*2014-8-1
*/
{
privatefinalLoggerlog=LoggerFactory.getLogger(CommonInterceptor.class);
publicstaticfinalStringLAST_PAGE="com.alibaba.lastPage";
/*
*利用正則映射到需要攔截的路徑
privateStringmappingURL;
publicvoidsetMappingURL(StringmappingURL){
this.mappingURL=mappingURL;
}
*/
/**
*在業務處理器處理請求之前被調用
*如果返回false
*從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈
*如果返回true
*執行下一個攔截器,直到所有的攔截器都執行完畢
*再執行被攔截的Controller
*然後進入攔截器鏈,
*從最後一個攔截器往回執行所有的postHandle()
*接著再從最後一個攔截器往回執行所有的afterCompletion()
*/
@Override
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
if("GET".equalsIgnoreCase(request.getMethod())){
RequestUtil.saveRequest();
}
log.info("==============執行順序:1、preHandle================");
StringrequestUri=request.getRequestURI();
StringcontextPath=request.getContextPath();
Stringurl=requestUri.substring(contextPath.length());
log.info("requestUri:"+requestUri);
log.info("contextPath:"+contextPath);
log.info("url:"+url);
Stringusername=(String)request.getSession().getAttribute("user");
if(username==null){
log.info("Interceptor:跳轉到login頁面!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
returnfalse;
}else
returntrue;
}
/**
*在業務處理器處理請求執行完成後,生成視圖之前執行的動作
*可在modelAndView中加入數據,比如當前時間
*/
@Override
publicvoidpostHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,
ModelAndViewmodelAndView)throwsException{
log.info("==============執行順序:2、postHandle================");
if(modelAndView!=null){//加入當前時間
modelAndView.addObject("var","測試postHandle");
}
}
/**
*在DispatcherServlet完全處理完請求後被調用,可用於清理資源等
*
*當有攔截器拋出異常時,會從當前攔截器往回執行所有的攔截器的afterCompletion()
*/
@Override
publicvoidafterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,Exceptionex)
throwsException{
log.info("==============執行順序:3、afterCompletion================");
}
}
註:上述代碼里我寫了一個RequestUtil,主要實現獲取當前Request、Session對象,保存和加密頁面,取出等功能。
至此,攔截器已經實現了,效果如圖:
我直接訪問/test/hello,會被攔截
『捌』 使用springMVC的攔截器驗證登錄時,攔截器攔截了靜態的資源該怎麼解決
springmvc攔截器定義後,還需要在springmvc框架的配置文件中注冊,同時設置攔截的url路徑,即會造成對controller攔截的同時也對訪問的js和css文件進行攔截,可以通過配置不攔截js和css,例子如下
js和css放在web應用的static目錄下
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<mvc:exclude-mappingpath="/static/**"/>--設置不攔截static下資源
<beanclass="cn.sxt.rbac.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<mvc:exclude-mappingpath="/static/**"/>--設置不攔截static下資源
<beanclass="cn.sxt.rbac.interceptor.UrlInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
這樣在攔截controller同時,不會對static裡面的js、css或者其他靜態圖片資源進行攔截。
『玖』 spring mvc的靜態資源攔截器怎麼配置
初學者基本上使用1,2,3方案:
所有請求全部攔截,都在spring mvc 處理,靜態資源如下配置
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
所有請求全部攔截,但是在web.xml中添加對靜態資源的默認訪問,如下
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>所有請求全部攔截,在springmvc配置文件中添加如下,這種方式對spring版本必須要求3.0.5及以上。
<mvc:default-servlet-handler/>
然後是我極力推薦的一種,web.xml中配置DispatcherServlet的時候mapping如下配置,url-pattern不要全部攔截,把需要springmvc處理的請求添加自定義頭。這種方法性能最好。
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/自定義</url-pattern>
</servlet-mapping>
『拾』 Spring mvc 中,怎麼用註解配置靜態資源不需要被控制器調用
Spring MVC搭建項目的時候,想使用html頁面作為前端的視圖,你會發現html頁面不能訪問,原因是由於Spring攔截器將其攔截尋找控制器的緣故,解決辦法就是配置靜態資源:
1 <mvc:resources mapping="/js/*.js" location="/js/" />
2 <mvc:resources mapping="/**/*.html" location="/html/" />
3 <!-- <mvc:resources location="/" mapping="/**/*.html"/>
4 <mvc:resources location="/" mapping="/**/*.js"/>
5 <mvc:resources location="/" mapping="/**/*.css"/>
6 <mvc:resources location="/" mapping="/**/*.png"/>
7 <mvc:resources location="/" mapping="/**/*.gif"/> -->