JavaWeb研究ノート9:リスナー&フィルター

1-Listenerは原則とのインタフェースの呼び出しを紹介します

Listener-リスナー:特定のイベントの発生をリッスンインターフェース呼び出しの使用は、それが状態変化
三種類↓に、8の合計をリスナー
一类:监听作用域的创建和销毁
二类:监听作用域中属性的创建销毁和替换
三类:Session值的钝化和活化(Activation)
インターフェース呼び出し:あなたのテストクラス、インタフェースのクラスAのプロセスパラメータを仮定のみ書き込みインターフェースおよび方法の実施例により呼び出すことができ、その後、呼び出されるメソッド
原則インタフェースを呼び出し

2-リスナーは、3つのスコープを作成および破棄リッスン

web.xmlの設定に新しいリスナーを作成するには
:最初のリコールいくつかのスコープとスコープが何であるか、オブジェクト
1、pageContext - PageContext
2、request - HttpServletRequest
3、session - HttpSession
4、application - ServletContext
我々は、以下の3つのスコープ2,3,4リスニングのために主に、各スコープのためにリスナーオブジェクトは、実際にはスコープオブジェクト名+リスナーであります

  • ServletContextListener
    のServletContextを作成:
    启动服务器的时候
    のServletContextが破壊されました:
    关闭服务器、从服务器移除项目

  • ServletRequestListener(めったに使われない)
    要求の作成:
    访问服务器上的任意资源都会有请求出现。 访问 html、访问 jsp、访问 servlet
    リクエストが破壊されました:
    服务器已经对这次请求作出了响应之后

    public class MyRequestListener implements ServletRequestListener {
    	@Override
    	public void requestDestroyed(ServletRequestEvent sre) {
    		System.out.println("servletrequest 销毁了");
    	}
    	@Override
    	public void requestInitialized(ServletRequestEvent sre) {
    		System.out.println("servletrequest 初始化了");
    	}
    }
    
  • HttpSessionListener
    のセッション作成
    只要有调用getSession就创建。 html:(没有Session的调用) jsp:(默认调用getSession) servlet:(默认调用getSession)
    セッションの破壊を
    1、超时,30分钟 2、非正常关闭,销毁 3、正常关闭服务器(序列化)

    public class MySessionListener implements HttpSessionListener {
    	@Override
    	public void sessionCreated(HttpSessionEvent se) {
    		System.out.println("创建session了");
    	}
    	@Override
    	public void sessionDestroyed(HttpSessionEvent se) {
    		System.out.println("销毁session了");
    	}
    }
    

    リスナーの役割:
    使用それは、オブジェクトのスコープを作成したときに
    1が彼らの初期化を完了したい
    特定のタスクタイマー(タイマー)を実行するために、カスタムタスクスケジューラを実行2.

3-リスナーリスナーの3つのスコープのプロパティステータスの変更

使用AttributeListenerは書き換えやステータス変更表示
属性:、(セット)を追加します(設定:キーなど)を置き換え、除去(削除)三つの状態

  • ServletContext - ServletContextAttributeListene
    ServletContext
  • 要求 - ServletRequestAttributeListener
    リクエスト
  • セッション - HttpSessionAttributeListenerに
    セッション

HttpSessionBindingListenerを(あまり使用される、同様の効果は、プロパティの追加または削除するかどうかを確認することです)
> 监听对象与session绑定和解除绑定的动作

@Override
public void valueBound(HttpSessionBindingEvent event) {
	System.out.println("对象被绑定进来了");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
	System.out.println("对象被解除绑定");
}

ここでは、HttpSessionBindingListenerをしてHttpSessionAttributeListenerに違いを説明する必要があります。
2の役割に似てまずは、インターセプトされたオブジェクトはリフトに追加され、最大の違いは、リスナーをトリガしますが、場合なり、このインタフェースを実装した後、時間のセッションにオブジェクトを追加するリスナーオブジェクトであることを、BindingListenerですあなたが別のオブジェクトを追加し、リスナーがトリガされません。
その代わり、AttributeListenerは、オブジェクトが追加されたどのような長いセッションなど関係なくて、これはリスナーをトリガーする、あるSessionオブジェクトを、注意して、web.xmlで聞くためには、configure Sessionオブジェクトを実装するクラスに、これは、として理解することができますこれは、セキュリティゲートです。

4リスナー聴取HttpSessionのパッシベーション活性化

2つのリスナー上記のxmlファイルに登録する必要があり、そして最後のリスナーが登録する必要はありません、あなただけのインターフェイスを実装する必要があると述べました

HttpSessionActivationListener
用于监听现在session的值是钝化(序列化)还是活化(反序列化)的动作
。1、パッシベーション(シリアライズ)
把内存中的数据 存储到硬盘上
2、活性化(デシリアライズ)
一定要实现Serializable接口 若已经钝化,则重启服务器就自动活化了 即把硬盘中的数据读取到内存中

なぜ、そこには、受動的活性化すべきですか?
我々は一時的に、受動前に何かを行うことができるようにメモリに保存されたセッションは、起動に時間を使い、値にあまりにも多くの負担が増加します
自動的にデフォルトの不動態化を行い、イベント30分で、我々は手動で設定したイベントとパスすることができます

セッションの自動パッシベーションを構成する方法?
 図1に示すように、内部のTomcat / confに/ context.xmlに構成内
对所有的运行在这个服务器的项目生效
 のconf /カタリナ/ localhostの/のcontext.xml構成では2
对 localhost生效 localhost:8080
 3、META-INFウェブ工学プロジェクト/のcontext.xml構成で
只对当前的工程生效

	#maxIdleSwap : 1分钟不用就钝化
	#directory :  钝化后的那个文件存放的目录位置。
	#D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\helloworld
<Context>
	<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
		<Store className="org.apache.catalina.session.FileStore" directory="helloworld"/>
	</Manager>
</Context>
5-フィルターの紹介や使い方が簡単

フィルタフィルタは、実際にクライアントの要求は、ブラウザの問題、およびハンドルにサーブレットを送信するためにサーバーに送信され、あなたが途中でフィルタリングすることができ、実際には、フィルターの役割がインターセプトにある果たし
、そのようなことは何ができるかのように?
  いくつかの敏感な単語の1を濾過
  コーディング2.統一セット
  3.自動ログインを
  ...

フィルタのライフサイクル:サーバーは、プロジェクトがロードされたときに作成され、シャットダウンまたはアイテムが中にサーバーから削除されたときに破壊された
フィルタの実行順序:
 、クライアントが最初のフィルタがリリースされている場合はフィルタを介して、要求を行う1、サーブレットを取得
 フィルタが解除されない場合にのみ、複数のフィルタがある場合2、キューのマッピング順序に従って登録され、その後、キューの後ろ、及びフィルタが要求されないサーブレット


簡単な使用フィルタ:
フィルタ1、クラスの定義をその実装フィルター

public class FilterDemo implements Filter {
	public void destroy() {}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter……");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {}
}

図2に示すように、フィルタ・レジスタ

#在web.xml里面注册 注册的手法与servlet基本一样
<filter>
	<display-name>FilterDemo</display-name>
	<filter-name>FilterDemo</filter-name>
	<filter-class>com.itheima.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
	<filter-name>FilterDemo</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

フィルターの詳細:
1、あなたは、どのその後のdoFilter操作方法、チェーンのパラメータを解除したい場合は
chain.doFilter(要求、応答);次の要求がターゲットに到着するように、リリース
2、<url-pattern>/*</url-pattern>としてフォーマットサーブレットを書い
  1. 全路径匹配 以 / 开始
  2. 以目录匹配 以 / 开始 以 * 结束
  3. 以后缀名匹配 以 * 开始 以后缀名结束
3、ディスパッチャのセットアップ
  REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
  FORWARD : 只要是转发都拦截
  ERROR : 页面出错发生跳转
  INCLUDE : 包含页面的时候就拦截

6-フィルター自動ログ

1、ケーススタディ
ケーススタディ
2、優れたデータベースを構築する(ユーザー情報)、ページ(JSP)
3、AutoLoginFilter(メジャーコード):

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	try {
		//1.首先,无论用户进入什么页面,先判断用户是否登陆并且没关闭浏览器
		HttpServletRequest req = (HttpServletRequest) request;
		//如果已登录且没关闭浏览器,则自动放行
		if(req.getSession().getAttribute("user")!=null){
			chain.doFilter(request, response);
		}else{//session值不存在
			Cookie[] cookies = req.getCookies();
			Cookie cookie = CookieUtil.findCookie(cookies, "autologin");
			if(cookie!=null){//如果cookie存在,则说明用户已经登录过
				String value = cookie.getValue();
				String username = value.split("#")[0];
				String password = value.split("#")[1];
				UserDao dao = new UserDaoImpl();
				UserBean user = dao.login(username, password);
				req.getSession().setAttribute("user", user);
				chain.doFilter(request, response);
			}else{
				//cookie和session都不存在,直接放行要求登录
				chain.doFilter(request, response);
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
		chain.doFilter(request, response);
	}
}

4、がloginservlet(メジャーコード):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String auto_login = "";
		auto_login+=request.getParameter("autologin");
		System.out.println(auto_login);
//			System.out.println(username+"=="+password+"=="+aotologin);
		UserDao dao = new UserDaoImpl();
		UserBean user = dao.login(username,password);
		if(user != null){
			//将user存储到session中
			request.getSession().setAttribute("user", user);
			if(auto_login.equals("on")){
				//设置autologin的Cookie,包含账号密码,准备自动登录
				Cookie autologin = new Cookie("autologin", (username+"#"+password));
				//设置最长存活时间
				autologin.setMaxAge(60*2);
				//设置保存路径
				autologin.setPath(request.getContextPath());
				response.addCookie(autologin);
			}
			response.sendRedirect("index.jsp");
		}else{
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().write("账号或密码错误!请重新登录!");
			response.setHeader("refresh", "3;login.jsp");
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
HPF-自己概要

  リスナーとの最初の接触は、特にフィルタすると、この特定のケースの自動ログインが理解するところではありませんが、このブログを書くために、私はケースという、オリジナルと変更されたコードのためのコードに変更を加えましたコードを比較し、最終的に問題を発見しました。すべてのすべてで、私は深い理解のこれら二つの成分を書き留めることを願って!
  ---短いステップ、千マイル;強大な急流にない小川。

公開された15元の記事 ウォン称賛18 ビュー4568

おすすめ

転載: blog.csdn.net/oZuoShen123/article/details/105338631