日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)

發(fā)布時(shí)間:2023/12/10 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近碰到了一個(gè)spring的web.xml無法跳轉(zhuǎn)到index.html頁面的小問題,查了之后從下面這篇文章中受益,特此轉(zhuǎn)發(fā),謝謝!!!

一、我們都知道在基于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> <strong><url-pattern>/</url-pattern></strong> </servlet-mapping>

此處需要特別強(qiáng)調(diào)的是<url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那么請求時(shí)可以通過DispatcherServlet轉(zhuǎn)發(fā)到相應(yīng)的Action或者Controller中的,但是返回的內(nèi)容,如返回的jsp還會再次被攔截,這樣導(dǎo)致404錯(cuò)誤,即訪問不到j(luò)sp。所以如果以后發(fā)現(xiàn)總是有404錯(cuò)誤的時(shí)候,別忘了check一下<url-pattern>/</url-pattern>的配置是否是/*.

二、其實(shí)Spring 的Servlet攔截器匹配規(guī)則(即<url-pattern>...</url-pattern>)都可以自己定義,例:當(dāng)映射為@RequestMapping("/user/add")時(shí)

?

1、攔截*.do、*.htm, 例如:/user/add.do

這是最傳統(tǒng)的方式,最簡單也最實(shí)用。不會導(dǎo)致靜態(tài)文件(jpg,js,css)被攔截。

?

2、攔截/,例如:/user/add

可以實(shí)現(xiàn)現(xiàn)在很流行的REST風(fēng)格。很多互聯(lián)網(wǎng)類型的應(yīng)用很喜歡這種風(fēng)格的URL。

弊端:會導(dǎo)致靜態(tài)文件(jpg,js,css)被攔截后不能正常顯示。想實(shí)現(xiàn)REST風(fēng)格,事情就是麻煩一些。后面有解決辦法還算簡單。

?

?

3、攔截/*,這是一個(gè)錯(cuò)誤的方式,請求可以走到Action中,但轉(zhuǎn)到j(luò)sp時(shí)再次被攔截,不能訪問到j(luò)sp。

?

三、如何訪問到靜態(tài)的文件,如jpg,js,css?

?

如果你的DispatcherServlet攔截"*.do"這樣的有后綴的URL,就不存在訪問不到靜態(tài)資源的問題。

如果你的DispatcherServlet攔截"/",為了實(shí)現(xiàn)REST風(fēng)格,攔截了所有的請求,那么同時(shí)對*.js,*.jpg等靜態(tài)文件的訪問也就被攔截了。

我們要解決這個(gè)問題。

?

?

目的:可以正常訪問靜態(tài)文件,不可以找不到靜態(tài)文件報(bào)404。

?

方案一:激活Tomcat的defaultServlet來處理靜態(tài)文件

<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>

?特點(diǎn):1.?要配置多個(gè),每種文件配置一個(gè)。

? ? ? ? ? ? ?2.?要寫在DispatcherServlet的前面, 讓defaultServlet先攔截請求,這樣請求就不會進(jìn)入Spring了。

? ? ? ? ? ? ?3. 高性能。

備注:

Tomcat, Jetty, JBoss, and GlassFish 自帶的默認(rèn)Servlet的名字 -- "default"
Google App Engine?
自帶的?默認(rèn)Servlet的名字 -- "_ah_default"
Resin?
自帶的?默認(rèn)Servlet的名字 -- "resin-file"
WebLogic
?自帶的?默認(rèn)Servlet的名字? -- "FileServlet"
WebSphere??
自帶的?默認(rèn)Servlet的名字 -- "SimpleFileServlet"

?

方案二: 在spring3.0.4以后版本提供了mvc:resources , ?使用方法:

Xml代碼??
  • <!--?對靜態(tài)資源文件的訪問?-->??????
  • <mvc:resources?mapping="/images/**"?location="/images/"?/>???
  • ?images/**映射到 ResourceHttpRequestHandler進(jìn)行處理,location指定靜態(tài)資源的位置.可以是web application根目錄下、jar包里面,這樣可以把靜態(tài)資源壓縮到j(luò)ar包中。cache-period 可以使得靜態(tài)資源進(jìn)行web cache?

    ?
    如果出現(xiàn)下面的錯(cuò)誤,可能是沒有配置<mvc:annotation-driven />的原因。?
    報(bào)錯(cuò)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,
    這樣就巧妙的把對靜態(tài)資源的訪問由HandlerMapping轉(zhuǎn)到ResourceHttpRequestHandler處理并返回,所以就支持classpath目錄,jar包內(nèi)靜態(tài)資源的訪問.
    另外需要注意的一點(diǎn)是,不要對SimpleUrlHandlerMapping設(shè)置defaultHandler.因?yàn)閷tatic uri的defaultHandler就是ResourceHttpRequestHandler,
    否則無法處理static resources request.

    ?

    方案三 ,使用<mvc:default-servlet-handler/>

    Xml代碼??
  • <mvc:default-servlet-handler/>???
  • ?

    會把"/**" url,注冊到SimpleUrlHandlerMapping的urlMap中,把對靜態(tài)資源的訪問由HandlerMapping轉(zhuǎn)到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 處理并返回.
    DefaultServletHttpRequestHandler使用就是各個(gè)Servlet容器自己的默認(rèn)Servlet.

    ?

    ?

    補(bǔ)充說明:多個(gè)HandlerMapping的執(zhí)行順序問題:

    DefaultAnnotationHandlerMapping的order屬性值是:0

    <mvc:resources/?>自動注冊的?SimpleUrlHandlerMapping的order屬性值是:?2147483646

    ?

    <mvc:default-servlet-handler/>自動注冊?的SimpleUrlHandlerMapping?的order屬性值是:?2147483647

    ?

    ?

    spring會先執(zhí)行order值比較小的。當(dāng)訪問一個(gè)a.jpg圖片文件時(shí),先通過 DefaultAnnotationHandlerMapping 來找處理器,一定是找不到的,因?yàn)槲覀儧]有叫a.jpg的Action。然后再按order值升序找,由于最后一個(gè) SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定會匹配上,就可以響應(yīng)圖片。

    最后再說明一下,方案二、方案三 在訪問靜態(tài)資源時(shí),如果有匹配的(近似)總攔截器,就會走攔截器。如果你在攔截中實(shí)現(xiàn)權(quán)限檢查,要注意過濾這些對靜態(tài)文件的請求。

    ?

    如果你的DispatcherServlet攔截 *.do這樣的URL后綴,就不存上述問題了。還是有后綴方便。


    總結(jié)

    以上是生活随笔為你收集整理的Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。