SpringMVC,3种不同的URL路由配置方法 [转]
1. 先说说一种比较常见的:
<servlet>
让SpringMVC指拦截 动态请求,js、css、img等静态资源不经过Spring,直接让Web容器处理。
如果配置了拦截器,也只会拦截.html动态请求。
静态资源不走Spring,也不走拦截器,性能当然是比较好的。
如果使用了Nginx,配置静态资源拦截,让Nginx处理静态资源的访问。因为Nginx在处理静态资源方面,比Tomcat等Web容器要强。
缺点:这种拦截动态请求的方法,比较死板。
2. 我自己经常有一种需求,http://FansUnion.cn/news 这种不指定.html后缀的其实也是 动态请求,所以我在配置url-pattern喜欢用“/”,即拦截所有的请求。URL是可以灵活配置了,问题又来了,静态资源不再由Tomcat处理,所以必须在SpringMVC中再次配置,
<mvc:resources mapping="/static/**" location="/static/" />
让SpringMVC把static静态资源也处理了。显然,让SpringMVC处理静态资源的性能没有Tomcat直接处理比较高。
理论上,请求中转的次数越多, 性能越差。
本以为万事大吉,虽然静态资源的性能较低,至少程序可以正常运行了,“反正是混过去了”。
进一步的需求,如果在Spring中配置了登录等拦截器,这个时候也会把 静态资源给拦截进来。
<mvc:resources mapping="/static/**" location="/static/" /> 这种URL映射,也无法逃脱拦截器的魔爪。
我是怎么发现这个问题的呢?
public class BaseLoginInterceptor extends HandlerInterceptorAdapter {
}
公司的项目,Boss的登录拦截器配置如上,“ HandlerMethod handlerMethod = (HandlerMethod) handler;”。但是我在自己的项目中,发现这行代码是有问题的。如果静态资源被拦截到,会报错:
通过异常可以发现, Object handler是ResourceHttpRequestHandler ,而不是HandlerMethod。
因为 mvc:resources把静态资源请求交给了ResourceHttpRequestHandler 处理,因此强制转换是有问题的。
公司项目中Boss的配置之所以没有出现问题,是因为他配置的是只拦截“.html” 动态请求,所以强制转换总是成立的。
---------------------------------------------
我们分析了上述两种情况, 发现“根本矛盾”“根本需求”是啥?
1.动态请求的URL应该非常灵活,/news /news.html都应该算作动态请求。
2.SpringMVC的url-pattern可以配置 / , *.html,或者正则表达式,但是我不太喜欢用正则表达式。
3.如果可能,SpringMVC最好不要拦截静态资源,让Tomcat容器直接处理更好。
这是为了性能考虑。
4.如果线上服务器配置了Nginx,我可以选择让Nginx拦截静态请求,因为比Tomcat处理性能更高。
本地是否配置Nginx,都不需要改动任何代码。
-------------------------------------------------
上面说的 第一种方法的缺陷是,url配置不够灵活。
第二种方法的缺陷是,SpringMVC要拦截静态资源,而且登录拦截器 也会拦截 静态资源,不但性能差,程序还得再次修改,判断HandlerMethod的实际类型。
3.终极解决方案:
以我习惯用的第2种方法为基础,进一步改进:
去掉<mvc:resources mapping="/static/**" location="/static/" />,不做静态资源请求的映射。
在web.xml里增加如下配置:
</servlet-mapping>
上述配置,激活Tomcat的defaultServlet来处理静态文件。
千万要注意,上述配置,要在 SpringMVC的拦截器DispatchServlet之前。
参考了:http://blog.chinaunix.net/uid-20586655-id-3000946.html 第七部分
网友提问:http://www.iteye.com/problems/66915,http://www.iteye.com/problems/69983
这样 SpringMVC不再响应静态资源,登录拦截器也没有问题了。
SpringMVC,3种不同的URL路由配置方法 [转]的更多相关文章
- SpringMVC,3种不同的URL路由配置方法
1. 先说说一种比较常见的: <servlet> <servlet-name>theDispatcher</servlet-name> <servlet-cl ...
- SpringMVC,3种不同的URL路由配置方法(这根本不是一个小问题)
转载自:http://blog.csdn.net/fansunion/article/details/41149287?utm_source=tuicool&utm_medium=referr ...
- Django 02 url路由配置及渲染方式
Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...
- 3/19 Django框架 url路由配置及模板渲染
3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...
- Django学习手册 - 正则URL路由配置/路由分发
############################################### 总结: 一.url路由配置: 方式一:(通过url链接get获取) 方式二:(url路由匹配方式获取-拓 ...
- 8.MVC框架开发(URL路由配置和URL路由传参空值处理)
1.ASP.NET和MVC的路由请求处理 1)ASP.NET的处理 请求---------响应请求(HttpModule)--------处理请求(HttpHandler)--------把请求的资源 ...
- django中url路由配置及渲染方式
今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...
- Django(一):url路由配置和模板渲染
urls.py路由用法 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resoure L ...
- url路由配置以及渲染方式
路由分配及模板渲染 路由系统 urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',include('teacher.url ...
随机推荐
- HDU-1492-The number of divisors(约数) about Humble Numbers -求因子总数+唯一分解定理的变形
A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, ...
- mybatis框架中XxxxMaper.xml的文件
我们知道在mybatis框架中,config.xml中会关联到许多的XxxxMapper的xml文件,这些文件又对应着一个个的接口,来观察下这些xml文件 从以下这个文件为例子: <?xml v ...
- <Django> MVT三大块之Models(模型)
1.ORM(对象-关系-映射)---面向对象,不需要面向SQL语句 根据对象的类型生成表结构 将对象.列表的操作,转化成SQL语句 将SQL语句查询的结果转化成对象.列表 目的:实现数据模型与数据库的 ...
- python基础语法(运算符及优先级)
python基础语法(运算符及优先级) python语言支持的运算符类型 算数运算符 假设变量a为10,变量b为21 算数符 描述 实例 + 加-两个对象相加 a+b结果31 - 减-得到一个负数或者 ...
- docker上安装ActiveMQ
1.查看是否已经存在镜像 docker images 2.搜索镜像 docker search activemq 3.拉取镜像 docker pull webcenter/activemq 4.构建容 ...
- oi知识表
- 04.Mybatis输出映射之ResultMap
当实体类中的字段名与数据库中的字段名不一致时需要手动设置映射关系 在Mapper.xml中定义 <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo ...
- 2016.10.29初中部上午NOIP普及组比赛总结
2016.10.29[初中部 NOIP普及组 ]模拟赛 做得好爽! 进度: 比赛:35+45+AC+0=180 改题:AC+AC+AC+0=300 幸运的数 有点无语--之前怕超限,还特意利用程序打了 ...
- Spring Boot 整合 ActiveMQ
依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...
- MySQL操作表和表记录
目录 操作表 增 列约束 列类型 删 改 修改表名 增加字段 修改字段 删除字段 查 复制表结构 操作表数据 增 删 改 查 操作表 增 创建表语法 创建一个表,多个字段: create table ...