天天看點

Servlet過濾器、編碼過濾、Servlet監聽器過濾器Servlet監聽器

目錄

過濾器

簡介

編碼過濾

登入檢測

Servlet監聽器

對Servlet上下文監聽

對session監聽

Servlet一共分為三類:基礎Servlet、過濾器、監聽器。

過濾器

簡介

過濾器的本質在于過濾所有的非法操作,而且所有的過濾需要自動實作過濾操作。想要在WEB中實作過濾器,需要一個專門的程式類,這個類需要去實作javax.servlet.Filter接口,這個接口裡面定義有三個方法:

  • 初始化:public void init(FilterConfig filterConfig) throws ServletException ;

   | - 當容器啟動後,過濾器就啟動了

  • 執行過濾:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException ;
  • 銷毀過濾器:public void destroy()

範例:建議MyFilter過濾器程式類

package cn.ren.filter;

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;

public class MyFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("*** 初始化參數 ****" + filterConfig.getInitParameter("myparam"));
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println(" *** 過濾器執行前 *****");
		chain.doFilter(request, response);
		System.out.println(" *** 過濾器執行後 *****");
	}
	@Override
	public void destroy() {
		System.out.println("*** 銷毀 ***");
	}

}
           

對于每個過濾器而言将使用者的請求轉發到目标位置需要利用FilterChain接口完成,這個接口;裡面定義有 如下方法:

  • public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException
Servlet過濾器、編碼過濾、Servlet監聽器過濾器Servlet監聽器

過濾器依然屬于Servlet程式,是以依然需要在web.xml中進行配置

<filter>
  	<filter-name>MyFliter</filter-name>
  	<filter-class>cn.ren.filter.MyFliter</filter-class>
  	<init-param>
  		<param-name>myparam</param-name>
  		<param-value>init_param</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>MyFliter</filter-name>
  	<!-- 這裡是過濾路徑,設定為“/*”表示過濾所有路徑,如果設定具體,則.. -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>           
Servlet過濾器、編碼過濾、Servlet監聽器過濾器Servlet監聽器

所有的過濾器會根據器過濾路徑自動進行執行,執行時一定要使用FilterChain接口中的doFilter()方法,将使用者請求向後傳遞。

編碼過濾

編碼過濾主要是為了解決頁面亂碼的問題,如果所有的頁面通過過濾器進行編碼過濾,就不需要在每個頁面上編寫過濾代碼。

範例:定義一個input.jsp頁面

<body>
	<form action="show.jsp" method="post">
		資訊:<input type="text" name="msg" id="msg" >
		<input type="submit" value="發送">
	</form>
</body>           

範例:編寫show.jsp頁面

<h1>msg = ${param.msg}</h1>           

範例:編寫一個編碼過濾器

package cn.ren.filter;

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;

public class EncodingFilter implements Filter {
	private String charset = "UTF-8" ;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 可以通過初始化參數進行過濾器編碼的同一配置,這樣如果要更換編碼,這樣修改web.xml配置檔案
		if(filterConfig.getInitParameter("charset") != null) {
			this.charset = filterConfig.getInitParameter("charset") ;
		}  
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding(this.charset);
        response.setCharacterEncoding(this.charset);
		chain.doFilter(request, response);
	}

}
           
<filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>cn.ren.filter.EncodingFilter</filter-class>
  	<init-param>
  		<param-name>charset</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<!-- 這裡是過濾路徑,設定為“/*”表示過濾所有路徑,如果設定具體,則.. -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>           
Servlet過濾器、編碼過濾、Servlet監聽器過濾器Servlet監聽器

規範以後的開發程式使用編碼過濾,不用在頁面編寫編碼

登入檢測

之後更。。。。。

Servlet監聽器

Servlet監聽器是對整個WEB狀态進行監聽,主要分為兩種形式:application監聽(ServletContext監聽、整個容器監聽)、session監聽(使用者的狀态);

對Servlet上下文監聽

實作對Servlet上下文監聽,那麼就需要兩種監聽處理:

  • 對Servlet上下文的狀态監聽:javax.servlet.ServletContextListener

        | - 容器啟動:public void contextInitialized(ServletContextEvent sce)

        | - 容器銷毀:public void contextDestroyed(ServletContextEvent sce)

        | - ServletContextEvent 事件對象:public ServletContext getServletContext()

  • 對Servlet上下文屬性監聽:javax.servlet.ServletContextAttributeListener

        |- 增加屬性:public void attributeAdded(ServletContextAttributeEvent event)

        |- 替換屬性:public void attributeRemoved(ServletContextAttributeEvent event)

        |- 删除屬性: public void attributeReplaced(ServletContextAttributeEvent event)

        |- ServletContextAttributeEvent事件對象:

             |- 取得屬性名稱:public  String getName()

             |- 取得屬性内容:public Object getValue()

範例:定義一個Servlet的整體監聽

package cn.ren.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener, ServletContextAttributeListener {
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("*** 容器啟動 ***" + sce.getServletContext().getRealPath("/"));
	}	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("*** 容器銷毀 ***" + sce.getServletContext().getRealPath("/"));
	}
	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		System.out.println(" *** 增加application *** name = " + event.getName() + "、value = " + event.getValue());
	}
	@Override
	public void attributeRemoved(ServletContextAttributeEvent event) {
		System.out.println(" *** 删除application *** name = " + event.getName() + "、value = " + event.getValue());
	}
	@Override
	public void attributeReplaced(ServletContextAttributeEvent event) {
		System.out.println(" *** 替換application *** name = " + event.getName() + "、value = " + event.getValue());
	}
}
           

配置

<listener>
  	<listener-class>cn.ren.listener.MyListener</listener-class>
  </listener>           
<%
    //application.setAttribute("msg", "www.baidu.com") ;
    application.removeAttribute("msg") ;
%>

           
Servlet過濾器、編碼過濾、Servlet監聽器過濾器Servlet監聽器

對session監聽

session監聽指的是針對一個使用者的狀态監聽,有兩種:

  • session的狀态監聽:javax.servlet.http.HttpSeesionListener;

      | - session建立:public void sessionCreated(HttpSessionEvent se) ;

      | - session銷毀:public void sessionDestroyed(HttpSessionEvent se) ;

      | - HttpSessionEvent 事件: public HttpSession getSession()

  • seesion的屬性監聽:javax.servlet.http.HttpSessionAttributeListener

      | - 增加屬性:public void attributeAdded(HttpSessionBindingEvent event)

      | - 替換屬性:pbulic void attributeRemoved(HttpSessionBindingEvent event)

      | - 銷毀屬性:public void attributeReplaced(HttpSessionBindingEvent event)

      | - HttpSessionBindingEvent 事件:

            | - public String getName()

            | - public Object getValue()

            | - public HttpSession getSession()

範例:觀察Session

package cn.ren.listener;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("**** Session建立 ***" + se.getSession().getId());
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("**** Session銷毀***" + se.getSession().getId());
	}
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		System.out.println("**** Session屬性增加 ***" + event.getName() + "、" +  event.getValue());
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		System.out.println("****屬性删除 ***" + event.getName() + "、" +  event.getValue());
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		System.out.println("****屬性替換***" + event.getName() + "、" +  event.getValue());
	}
	
}
           
<listener>
  	<listener-class>cn.ren.listener.SessionListener</listener-class>
  </listener>           

session有三種情況會銷毀:

  • 【項目運作時】使用session.invalidate()方法銷毀;
  • 【項目運作過程中】session過時銷毀,預設時間是30分鐘;
  • 【項目開發之中】web項目重新加載會銷毀;
Servlet過濾器、編碼過濾、Servlet監聽器過濾器Servlet監聽器

過時時間可以自定義:(時間機關為1分鐘)

<session-config>
  	<session-timeout>1</session-timeout>
  </session-config>           

繼續閱讀