过滤器(filter)跟(interceptor)
首先众所周知,过滤器是与ervlet容器支持的,拦截器是与Spring容器支持的。
先谈谈Servlet(小服务程序)=Service+Applet(小应用程序):
Servlet是一个供其他Java程序调用的Java类,不能独立运行。Servlet的生命周期是由Servlet容器控制的,分为三个阶段:初始化,运行,销毁。Servlet的生命周期在百科中都有,概括而言就是由web容器调用,客户端发送请求的时候,实例化Servlet对象并初始化,再调用Service()方法离得doPost()或者doGetI()或者其他最后销毁。{需要注意的是Servlet一般只被初始化一次,即再次请求的时候不用init()直接调用service()方法}。
在eclipse中使用如下:
见附件,现在用的是4.4版本的好像web.xml就没有以前的servlet-mapping和servlet-name还有url了,说的不对请指出谢谢。
那Servlet说完了该说正点了Filter(过滤器):
<filter> <filter-name>mainPageFilter</filter-name> <filter-class>com.meihf.hjoyblog.filter.MainPageFilter</filter-class> </filter> <filter-mapping> <filter-name>mainPageFilter</filter-name> <url-pattern>/main/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
class对应你项目下的类目录,url-pattern是拦截请求。2.4版本后新增的<dispatcher>标签有REQUEST,FORWARD,INCLUDE,ERROR分别解释为:通过客户端传来的请求,通过forward传来的请求,通过include传来的请求和<error-page>传来的请求,默认是REQUEST。
package com.hanyx.hjoyblog.filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpUtils; import org.springframework.web.filter.OncePerRequestFilter; public class MainPageFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain fc) throws ServletException, IOException { @SuppressWarnings("deprecation") CharSequence requestPath = HttpUtils.getRequestURL(request); int start = requestPath.toString().lastIndexOf("main")+4; String subPath = (String) requestPath.subSequence(start,requestPath.length()); request.setAttribute("subPath", "/HJoyBlog/main"+subPath); request.getRequestDispatcher("/main").forward(request, response); } }
你所写的拦截器的类继承OncePerRequestFilter,这是为什么呢?
因为要确保一次 请求只通过一次拦截器不需重复。
再来说说interceptor(拦截器)是利用发射来管理这个类。拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求都起作用。另外在action的生命周期中,拦截器可以多次被调用,而过滤器只在初始化的时候被调用一次。
拦截器是做一些业务逻辑的操作。具体怎样使用如下代码:
这里先空出来,暂时还没有写这里的代码,配置的话同理写一个拦截器,然后在struts.xml中进行配置,等我写了我会再贴出来。
后续再补充还有SpringMVC的interceptor也会补充,谢谢。说的不对请大家指出。