zbb20170228_spring servlet路径过滤的区别 / /* *.do springmvc 如何访问到静态的文件,如jpg,js,css?...

Spring MVC静态资源处理
本文介绍了在Spring MVC中处理静态资源如图片、JS和CSS文件的三种方法:激活Tomcat的defaultServlet、使用<mvc:resources>标签以及使用<mvc:default-servlet-handler>标签,并讨论了它们的优缺点。

当映射为@RequestMapping("/user/add")时:
1、拦截*.do,例如:/user/add.do,弊端:所有的url都要以.do结尾。不会影响访问静态文件。
2、拦截/app/*,例如:/app/user/add,弊端:请求的url都要包含/app,@RequestMapping("/user/add")中不须要包含/app。
3、拦截/,例如:/user/add,弊端:对jpg,js,css静态文件的访问也被拦截不能正常显示。后面有解决办法。
4、拦截/*,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。

 

如何访问到静态的文件,如jpg,js,css?

 

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.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>  
<!--要配置多个,每种文件配置一个 -->

 

  

要写在DispatcherServlet的前面, 让 defaultServlet先拦截,这个就不会进入Spring了,我想性能是最好的吧。

 

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 的使用方法:


<!-- 对静态资源文件的访问 --> <mvc:resources mapping="/images/**" location="/images/" />

 并增加一下引用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">

 

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

 

  1. <mvc:default-servlet-handler/>  

 

会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

 

补充说明:多个HandlerMapping的执行顺序问题:

DefaultAnnotationHandlerMapping的order属性值是:0

<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 2147483646

 

<mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping 的order属性值是: 2147483647

 

spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫a.jpg的Action。再 按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定会匹配上,再响应图片。

 

访问一个图片,还要走层层匹配。真不知性能如何?改天做一下压力测试,与Apache比一比。

 

最后再说明一下,如何你的DispatcherServlet拦截 *.do这样的URL,就不存上述问题了。

转载于:https://www.cnblogs.com/super-admin/p/6481314.html

BEGIN /tmp/ffconf.W2379748/test.c 1 #include <stddef.h> 2 #if !(__riscv_zbb) 3 #error "unsatisfied condition: __riscv_zbb" 4 #endifEND /tmp/ffconf.W2379748/test.criscv64-tizen-linux-gnu-gcc -O2 -g2 -gdwarf-4 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -Wformat-security -Wformat -fmessage-length=0 -Wno-implicit-fallthrough -Wl,-z,relro,--as-needed -feliminate-unused-debug-types -Wformat -mabi=lp64d -march=rv64gc -Wl,-O1 -Wl,--hash-style=gnu -g -Wall -g -fPIC -DTIZEN_FEATURE_FFMPEG -DDBG_GSTFFMPEG_ALONE -DENABLE_SW_TBM_VXIMAGESINK -DTIZEN_PRODUCT_TV -DDRM_MAPI_AARCH_64 -fno-lto -fPIC -march=rv64gcv_zbb -I/home/abuild/rpmbuild/BUILD/gst-ffmpeg-1.45.0.tv/gst-libs/ext/ffmpeg/external_lib/include -I/usr/include/libpng16 -Wl,-z,relro -E -o /tmp/ffconf.W2379748/test.o /tmp/ffconf.W2379748/test.ctest_ld cctest_ccBEGIN /tmp/ffconf.W2379748/test.c 1 int main(void){ return 0; }END /tmp/ffconf.W2379748/test.criscv64-tizen-linux-gnu-gcc -O2 -g2 -gdwarf-4 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -Wformat-security -Wformat -fmessage-length=0 -Wno-implicit-fallthrough -Wl,-z,relro,--as-needed -feliminate-unused-debug-types -Wformat -mabi=lp64d -march=rv64gc -Wl,-O1 -Wl,--hash-style=gnu -g -Wall -g -fPIC -DTIZEN_FEATURE_FFMPEG -DDBG_GSTFFMPEG_ALONE -DENABLE_SW_TBM_VXIMAGESINK -DTIZEN_PRODUCT_TV -DDRM_MAPI_AARCH_64 -fno-lto -fPIC -march=rv64gcv_zbb -I/home/abuild/rpmbuild/BUILD/gst-ffmpeg-1.45.0.tv/gst-libs/ext/ffmpeg/external_lib/include -I/usr/include/libpng16 -Wl,-z,relro -c -o /tmp/ffconf.W2379748/test.o /tmp/ffconf.W2379748/test.criscv64-tizen-linux-gnu-gcc -ldl -L/home/abuild/rpmbuild/BUILD/gst-ffmpeg-1.45.0.tv/gst-libs/ext/ffmpeg/external_lib/lib -L/usr/lib -Wl,-z,relro,-z,now -o /tmp/ffconf.W2379748/test /tmp/ffconf.W2379748/test.o -lpthread -ldl -lpng16 -ldav1d -lfdk-aac/usr/lib64/gcc/riscv64-tizen-linux-gnu/13.1.0/../../../../riscv64-tizen-linux-gnu/bin/ld: cannot find -ldav1d: No suc 这个问题可能是我哪个文件
03-29
mktemp -u XXXXXX 932979 test_cpp_condition stddef.h __riscv_zbb test_cpp BEGIN /tmp/ffconf.c1932982/test.c 1 #include <stddef.h> 2 #if !(__riscv_zbb) 3 #error "unsatisfied condition: __riscv_zbb" 4 #endif END /tmp/ffconf.c1932982/test.c riscv64-tizen-linux-gnu-gcc -O2 -g2 -gdwarf-4 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -Wformat-security -Wformat -fmessage-length=0 -Wno-implicit-fallthrough -Wl,-z,relro,--as-needed -feliminate-unused-debug-types -Wformat -mabi=lp64d -march=rv64gc -Wl,-O1 -Wl,--hash-style=gnu -g -Wall -g -fPIC -DTIZEN_FEATURE_FFMPEG -DDBG_GSTFFMPEG_ALONE -DENABLE_SW_TBM_VXIMAGESINK -DTIZEN_PRODUCT_TV -DDRM_MAPI_AARCH_64 -fno-lto -fPIC -march=rv64gcv_zbb -I/home/abuild/rpmbuild/BUILD/gst-ffmpeg-1.45.0.tv/gst-libs/ext/ffmpeg/fdk-aac/include -I/usr/include/libpng16 -Wl,-z,relro -E -o /tmp/ffconf.c1932982/test.o /tmp/ffconf.c1932982/test.c test_ld cc test_cc BEGIN /tmp/ffconf.c1932982/test.c 1 int main(void){ return 0; } END /tmp/ffconf.c1932982/test.c riscv64-tizen-linux-gnu-gcc -O2 -g2 -gdwarf-4 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -Wformat-security -Wformat -fmessage-length=0 -Wno-implicit-fallthrough -Wl,-z,relro,--as-needed -feliminate-unused-debug-types -Wformat -mabi=lp64d -march=rv64gc -Wl,-O1 -Wl,--hash-style=gnu -g -Wall -g -fPIC -DTIZEN_FEATURE_FFMPEG -DDBG_GSTFFMPEG_ALONE -DENABLE_SW_TBM_VXIMAGESINK -DTIZEN_PRODUCT_TV -DDRM_MAPI_AARCH_64 -fno-lto -fPIC -march=rv64gcv_zbb -I/home/abuild/rpmbuild/BUILD/gst-ffmpeg-1.45.0.tv/gst-libs/ext/ffmpeg/fdk-aac/include -I/usr/include/libpng16 -Wl,-z,relro -c -o /tmp/ffconf.c1932982/test.o /tmp/ffconf.c1932982/test.c riscv64-tizen-linux-gnu-gcc -ldl -L/home/abuild/rpmbuild/BUILD/gst-ffmpeg-1.45.0.tv/gst-libs/ext/ffmpeg/fdk-aac/lib -L/usr/lib -Wl,-z,relro,-z,now -o /tmp/ffconf.c1932982/test /tmp/ffconf.c1932982/test.o -ldl -lpng16 -lfdk-aac /usr/lib64/gcc/riscv64-tizen-linux-gnu/13.1.0/../../../../riscv64-tizen-linux
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值