`

过滤器(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也会补充,谢谢。说的不对请大家指出。

 

 


          

  • 大小: 34.9 KB
  • 大小: 24 KB
  • 大小: 32.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics