web中的Filiter:當客戶端訪問服務端資源的時候,過率器可以把請求攔截下來,完成一些特殊的功能 完成的操作一般都是通用的作用:列如登錄驗證。 web中的Listener一般用於載入一些初始化的內容。它們兩加上一個Servlet是web最重要的三個組件。 ...
0x00前言
web中的Filiter:當客戶端訪問服務端資源的時候,過率器可以把請求攔截下來,完成一些特殊的功能
完成的操作一般都是通用的作用:列如登錄驗證。
web中的Listener一般用於載入一些初始化的內容。它們兩加上一個Servlet是web最重要的三個組件。
0x01Filiter快速入門
0x1註解配置:
定義一個類,實現Fillter介面
通過註解的方式去配置註解中的括弧中的內容是你需要過濾的內容
@WebFilter(value = "*")//訪問什麼資源的時候就填誰的
public class Filterdemo1 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter被執行了");
chain.doFilter(request,response);//放行操作
}
}
0x2web.xml配置
創建兩個標簽一個是
<filter>
<filter-name>demo100</filter-name>
<filter-class>Filterdemo.Filterdemo1</filter-class>
</filter>
<filter>
<filter-name>demo100</filter-name>
<url-pattern>/*</url-pattern>
<!-- 這裡要主要你攔截的路徑要主要你的攔截器裡面是否已經配置了註解-->
</filter-mapping>
</web-app>
0x3其他方法
public void init(FilterConfig config) throws ServletException {
//在伺服器創建的時候會載入Filter它會被正常執行
}
public void destroy() {
//伺服器正常關閉的時候它會被執行
}
0x4過濾器配置詳解
具體的攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器才會被執行
2. 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執行
3. 尾碼名攔截: *.jsp 訪問所有尾碼名為jsp資源時,過濾器都會被執行
4. 攔截所有資源:/* 訪問所有資源時,過濾器都會被執行
具體攔截方式的配置
具體資源被訪問的方式:直接訪問,重定向,轉發
如果我們需要使用轉發訪問資源不被攔截器攔截,可以在註解中配置dispatcherTypes屬性的值。
dispatcherTypes 五種屬性:
1. REQUEST:預設值。瀏覽器直接請求資源
2. FORWARD:轉發訪問資源
3. INCLUDE:包含訪問資源
4. ERROR:錯誤跳轉資源
5. ASYNC:非同步訪問資源
看一下demo
@WebFilter(value = "index2.jsp",dispatcherTypes = DispatcherType.REQUEST)
public class Filterdemo2 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("過濾器被執行了");
chain.doFilter(request, response);
}
}
0x5過濾器鏈
1.執行順序(兩個過濾器為例子
過濾器1-->過濾器2-->資源執行-->過濾器2-->過濾器1
兩種方式
註解配置:類名字元串比較規則
xml配置:順序執行
0x02Filter案例
登錄案例
@WebFilter(filterName = "Filterdemo3")
public class Filterdemo3 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.contains("/login.jsp")||requestURI.contains("ServletLogin")){
chain.doFilter(req,response);
}else {
Object user = request.getSession().getAttribute("user");
if (user!=null){
chain.doFilter(req,response);
}else {
request.setAttribute("long_msg","fail");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
//chain.doFilter(request, response);
}
}
0x03Listener
1.概念:
事件:一件事情
事件源:事件發生的地方
監聽器:一個對象
註冊監聽:將事件源,事件,監聽器,綁定在一起。當事件源上發生某件事情的時候,執行監聽器代碼
0x1方法
定義一個類:實現ServletContextListener介面
@Override
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is initialized(when the Web application is deployed). */
//ServletContext被創建後會執行方法(伺服器)
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
/* This method is called when the servlet Context is undeployed or Application Server shuts down. */
//ServletContext被銷毀之前會執行方法(伺服器)
}
在xml中配置
<listener>
<listener-class>Lister.Listenerdemo1</listener-class>
</listener>
0x2看一個xml的案例
@WebListener
public class Listenerdemo1 implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {
public Listenerdemo1() {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is initialized(when the Web application is deployed). */
ServletContext servletContext = sce.getServletContext();
String initParameter = servletContext.getInitParameter("web.xml");//通過鍵值對的方式獲取的
String realPath = servletContext.getRealPath(initParameter);
try {
FileInputStream fileInputStream = new FileInputStream(realPath);
System.out.println("執行了");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
0x3通過註解來配置
很簡單就是在前面加一個@WebListener,一般監聽器在框架中我們只需要配置一下就可以了。
@WebListener
public class Listenerdemo1 implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener
0x4結尾
web三大組件基本上學完了Servlet Filiter Listener,這三大插件在後面的框架學習的時候還會接觸,後面還有一些零散的內容過後就要進入到框架的學習了。