中国拦截 Spring中拦截/和拦截/*的区别

Spring中拦截/和拦截/*的区别
Spring中拦截/和拦截/*的区别
在cmd下输入
doskey xiaohei=dir
doskey dir=echo bad mand or file name
现在dir命令将无法使用,由我设定的xiaohei代替了。
输入dir显示Bad Command Or File Name,而输入我自己设定的xiaohei,就是以前dir一样的功能。
知道这个用法,我们还可以使fdisk、format、deltree等危险的命令失效。
1、拦截*.do、*.htm, 例如:/user/add.do
这是最传统的方式,最简单也最实用。不会导致静态档案(jpg,js,css)被拦截。
2、拦截/,例如:/user/add
可以实现现在很流行的REST风格。很多网际网路型别的应用很喜欢这种风格的URL。
弊端:会导致静态档案(jpg,js,css)被拦截后不能正常显示。想实现REST风格,事情就是麻烦一些。后面有解决办法还算简单。
3、拦截/*,这是一个错误的方式,请求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。
1、Spring Web MVC是什么
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动型别的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
另外还有一种基于元件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器对映器(Handler Mapping)进行处理器管理和检视解析器(View Resolver)进行检视管理;页面控制器/动作/处理器为Controller介面(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支援本地化(Locale)解析、主题(Theme)解析及档案上传等;提供了非常灵活的资料验证、格式化和资料系结机制;提供了强大的约定大于配置(惯例优先原则)的契约式程式设计支援。
2.2、Spring Web MVC能帮我们做什么
√让我们能非常简单的设计出干净的Web层和薄薄的Web层;
√进行更简洁的Web层的开发;
√天生与Spring框架整合(如IoC容器、AOP等);
√提供强大的约定大于配置的契约式程式设计支援;
√能简单的进行Web层的单元测试;
√支援灵活的URL到页面控制器的对映;
√非常容易与其他检视技术整合,如Velocity、FreeMarker等等,因为模型资料不放在特定的API里,而是放在一个Model里(Map资料结构实现,因此很容易被其他框架使用);
√非常灵活的资料验证、格式化和资料系结机制,能使用任何物件进行资料系结,不必实现特定框架的API;
√提供一套强大的JSP标签库,简化JSP开发;
√支援灵活的本地化、主题等解析;
√更加简单的异常处理;
√对静态资源的支援;
√支援Restful风格。
1、拦截*.do、*.htm, 例如:/user/add.do 这是最传统的方式,最简单也最实用。不会导致静态档案(jpg,js,css)被拦截。 2、拦截/,例如:/user/add 可以实现现在很流行的REST风格。很多网际网路型别的应用很喜欢这种风格的URL。
一、我们都知道在基于Spring的Application中,需要在web.xml中增加下面类似的配置资讯:
<listener>
<listener-class>
.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Spring MVC Servlet -->
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>
.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"