過濾器、監聽器、攔截器的區別和一個簡單的實例

需要引入依賴
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
1:過濾器
Servlet中的過濾器是實現了javax.servlet.Filter接口的服務器端程序,主要的用途是在執行具體的方法前做一些業務邏輯判斷等。其工作原理是,只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,可進行邏輯判斷,如用戶是否已經登陸、有沒有權限訪問該頁面等等工作。它是隨你的web應用啓動而啓動的,只初始化一次,以後就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷燬

類的代碼如下:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyFilter extends HttpServlet implements Filter {

public void destroy() {
System.out.print("執行銷燬邏輯-------------------------------");
}

public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain filterChain) throws IOException, ServletException {
//業務邏輯代碼
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
request.setCharacterEncoding("UTF-8");
//繼續轉發請求(最後必須要寫這句話)
filterChain.doFilter(request, response);
}

public void init(FilterConfig arg0) throws ServletException {
System.out.print("執行初始化邏輯-------------------------------");
}
}
web.xml加入聲明:
<filter>
<filter-name>filter</filter-name>
<filter-class>com.common.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<!-- 攔截請求,這裏星號就是代表所有請求,也可以寫具體的地址 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

2:監聽器
監聽器是實現了javax.servlet.ServletContextListener 接口的服務器端程序,它也是隨web應用的啓動而啓動,只初始化一次,隨web應用的停止而銷燬。作用是: 做一些初始化工作
類的代碼如下:
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener{

public void contextDestroyed(ServletContextEvent arg0) {
/**
* 在web應用銷燬之前調用,將所有設置的內容清空
* 代碼看自已的需求添加
*/
System.out.print("銷燬方法。。。。。。");
}

public void contextInitialized(ServletContextEvent arg0) {
/**
* 做一些初始化的內容添加工作、設置一些基本的內容、比如創建數據庫連接,給結象賦值
* 代碼看自已的需求添加
* Web應用就可以通過ServletContext得到該方法裏面設置的內容了
*/
//比如我們給一個對象賦值
User user = new User();
user.setName("zhangsan");
user.setSex("男");
user.setAge(10);

//將對象存到容器中
ServletContext sc = arg0.getServletContext();
sc.setAttribute("user", user);
//在WEB應用的其它地方就可以通過下面這句話得到user這個對象了
//User user = (User)request.getSession().getServletContext().getAttribute("user");
System.out.print("開始初始化操作。。。。。。");
}
}
web.xml加入聲明
<listener>
<listener-class>com.common.MyListener</listener-class>
</listener>
2:攔截器
攔截器類似於fileter ,也是攔截用戶的請求,不同的是,它不需要在web.xml中配置,不隨WEB應用的啓動而啓動,只有調用相應的方法時纔會調用,在面向切面編程中應用的,就是在你的service或者一個方法前調用一個方法,或者在方法後調用一個方法。是基於JAVA的反射機制和動態代理

攔截器比前面二個要複雜很多,我們會用另一篇文章來專門講解。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章