セッション追跡およびインターセプターフィルター

Sesion和クッキー

セッション追跡技術とは

セッション追跡は、ユーザーのセッション全体を追跡するためにWebプログラムで一般的に使用される手法です。ユーザーセッション中のデータ管理を維持します。一般的に使用されるセッション追跡テクノロジーは、CookieとSessionです。

Cookieは、クライアントに情報を記録することでユーザーIDを判別します

セッションは、サーバー側で情報を記録することによってユーザーIDを決定します

クッキー

1.クッキーとは

	Cookie是客户端(一般指浏览器)请求服务器后,服务器发给客户端的一个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或状态等。
Cookie的作用:跟踪会话,记录一次会话中(即Session,一次会话可能会有多次请求,当然也可以有多个Cookie来跟踪不同的信息)的信息,这样服务器就会知道用户的状态,比如有没有登录成功,付款时购物车中的东西等,就相当于贴在客户端脑门上的纸条,浏览器看不到,但服务器看得到。

2.クッキーアプリケーション

2.1ユーザーをログインさせたままにする

ユーザーの情報をCookieに保存してブラウザに送信し、有効時間を長く設定して、ブラウザが今後WebサイトにアクセスしたときにCookieを保持し、サーバーがこれを使用してユーザーを識別できるようにします。 。ユーザー名やパスワードなどの情報を入力する必要がなくなりました。

2.2ユーザー名を記録する

ユーザーが正常にログインすると、Cookie内のユーザー名が直接読み取られ、次回のログイン時に表示されるため、ユーザーはユーザー名を再度入力する必要はなく、パスワードのみを入力する必要があります。

ケース:フォームを確認し、Cookieを保存します

LoginServlet.java

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        String uname = req.getParameter("uname");
        if("admin".equals(uname)){
    
    
            resp.sendRedirect("/success.jsp");
        }else {
    
    
            Cookie cookie = new Cookie("username", uname);
            resp.addCookie(cookie);
            resp.sendRedirect("/index.jsp");
        }
    }
}

index.jsp
    
    <%
  String val="";
      Cookie[] cookies = request.getCookies();
      if(cookies!=null){
    
    
        for (Cookie cookie : cookies) {
    
    
            if(cookie.getName().equals("username")) {
    
    
              val = cookie.getValue();
            }
        }
      }
      %>
    <form action="/login" method="post">
    用户名:<input type="text" name="uname" value="<%=val%>"><input type="submit" value="登录">
    </form>

3.クッキーの設定と取得

3.1HTTPサーブレットResponse.addCookieによるCookieの設定

注:新しいCookie()の両方のパラメーターは文字列です

Cookie cookie = new Cookie("jieguo","true");
response.addCookie(cookie);

<%
    Cookie[] cookies = request.getCookies();
    if(cookies!=null){
    
    
        for(int i=0; i<cookies.length;i++){
    
    
            out.print("cookieName="+cookies[i].getName()+"cookieValue="+cookies[i].getValue());
        }
    }
%>

3.2。ブラウザでCookieの内容を表示する

[外部リンク画像の転送に失敗しました。ソースサイトにアンチホットリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-S4TWqHD0-1610805422037)(D:\ Study \ JavaEE New Class ————開発\第7章-Javaweb \セクション5-フィルターとリスナー\コースウェアとnotes \ document \ effect.png)]

3.3。サーバーは、クライアントによって運ばれるCookieを取得します:HttpServletRequestを介して取得されます

<%
Cookie[] cookies = request.getCookies();
    if(cookies != null)
        for(Cookie c : cookies){
    
    
            String name = c.getName();//获取Cookie名称
            if("jieguo".equals(name)){
    
    
            	String value = c.getValue();//获取Cookie的值
            	bool = Boolean.valueOf(value);//将值转为Boolean类型
    }
}
%>

4.クッキーを削除します

同じ名前のCookieの最大存続時間を0に設定すると、Cookieを削除すると、ブラウザがCookieを保存しなくなり、Cookieがすぐに無効になります。

例:名前がusernameであるCookieをすぐに無効にする

//1.创建一个name为username的Cookie
Cookie cookie = new Cookie("username", "aaa");
//2.设置Cookie的有效时间为0
cookie.setMaxAge(0);//删除cookie的关键
//3.将cookie发送给浏览器,来替换同名Cookie
response.addCookie(cookie);

クッキーの有効期間

Cookieがブラウザに送信された後、ブラウザはCookieを永続的に保存しません。つまり、ブラウザは一定期間後にCookieを自動的に破棄します。

Cookieのデフォルトの有効期間は1セッション(ブラウザを開いたり閉じたりするプロセス)ですが、Cookieの有効期間を手動で指定することもできます

//setMaxAge用来设置Cookie的最大有效时间,需要int型的参数,代表有效的秒数
cookie.setMaxAge(秒数);
//当参数大于0时,会设置为指定的秒数
cookie.setMaxAge(30);
//当参数等于0时,浏览器不会保存Cookie,Cookie立即失效
cookie.setMaxAge(0);
//当参数小于0时,和不设置是一样,当前会话有效
cookie.setMaxAge(-100);
//设置一个永久有效的Cookie,并非永久,只是使Cookie的生命很长而已
cookie.setMaxAge(60*60*24*365*10);

セッション

1.セッションとは

セッションは、クライアントのステータスを記録するためのもう1つのメカニズムです。違いは、Cookieはクライアントのブラウザに保存され、セッションはサーバーに保存されることです。クライアントブラウザがサーバーにアクセスすると、サーバーはクライアント情報を何らかの形式でサーバーに記録します。これはセッションです。クライアントブラウザが再度アクセスすると、セッションからクライアントの状態を見つけるだけで済みます。

クッキーメカニズムが顧客の「パスポート」をチェックすることによって顧客の身元を決定することである場合、セッションメカニズムはサーバー上の「顧客リスト」をチェックすることによって顧客のアイデンティティを確認することです。セッションは、サーバー上のプログラムによって作成されたクライアントファイルに相当します。クライアントがアクセスするときは、クライアントファイルテーブルをクエリするだけで済みます。

2.セッション形式を作成します

Sessionに対応するクラスはjavax.servlet.http.HttpSessionです。各訪問者はSessionオブジェクトに対応し、クライアントのすべての状態情報はこのSessionオブジェクトに格納されます。Sessionオブジェクトは、クライアントがサーバーを初めて要求したときに作成されます。

セッションはキーと値の属性ペアでもあり、getAttribute(Stringkey)メソッドとsetAttribute(String key、Objectvalue)メソッドを介して顧客のステータス情報を読み書きします。request.getSession()メソッドを使用してサーブレットでクライアントのセッションを取得します

例えば:

HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性

3.セッションのライフサイクル

セッションはサーバー側に保存されます。より高速なアクセス速度を得るために、サーバーは通常、セッションをメモリに配置します。各ユーザーは独立したセッションを持ちます。セッションの内容が複雑すぎると、多数のクライアントがサーバーにアクセスしたときにメモリオーバーフローが発生する可能性があります。したがって、セッションの情報は可能な限り簡潔にする必要があります。

ユーザーが初めてサーバーにアクセスすると、セッションが自動的に作成されます。セッションは、JSPやサーブレットなどのプログラムにアクセスする場合にのみ作成されることに注意してください。HTMLやIMAGEなどの静的リソースにアクセスするだけでは、セッションは作成されません。セッションがまだ生成されていない場合は、request.getSession(true)でセッションを強制的に生成することもできます。

セッションが生成された後、ユーザーがアクセスを継続している限り、サーバーはセッションの最終アクセス時間を更新し、セッションを維持します。ユーザーがサーバーにアクセスするたびに、サーバーは、セッションの読み取りまたは書き込みに関係なく、ユーザーのセッションが「アクティブ」であると見なします。

ますます多くのユーザーがサーバーにアクセスするにつれて、ますます多くのセッションがあります。メモリのオーバーフローを防ぐために、サーバーは長期間アクティブでなかったセッションをメモリから削除します。この時間は、セッションのタイムアウト期間です。タイムアウト期間後にサーバーにアクセスしないと、セッションは自動的に無効になります。

セッションのタイムアウト期間はmaxInactiveInterval属性であり、対応するgetMaxInactiveInterval()を介して取得し、setMaxInactiveInterval(longinterval)を介して変更できます。

セッションタイムアウト時間は、web.xmlで変更することもできます。さらに、セッションのinvalidate()メソッドを呼び出すことにより、セッションを無効にすることができます。

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

4.セッションの一般的な方法

5.セッションのアプリケーションシナリオ

コードのデモンストレーション:1。ログイン2.終了(セッションの作成とセッションの削除)

場合

LoginServlet.java

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        String uname = req.getParameter("uname");
        if("admin".equals(uname)){
    
    
            req.getSession().setAttribute("loginuname",uname);
            resp.sendRedirect("/success.jsp");

        }else {
    
    
            Cookie cookie = new Cookie("username", uname);
            resp.addCookie(cookie);
            resp.sendRedirect("/index.jsp");
        }
    }
}

LoginOutServlet.java
    @WebServlet(value="/loginOut")
public class LoginOutServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //让session失效
        HttpSession session = req.getSession();
        //  session.removeAttribute("loginuname");
        session.invalidate();//让所有的session相关值都清除
        resp.sendRedirect("index.jsp");
    }
}

index.jsp
    
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1>index.jsp</h1>
  <a href="/testCookie">testCookie</a>
  <p>
  <%
  String val="";
      Cookie[] cookies = request.getCookies();
      if(cookies!=null){
    
    
        for (Cookie cookie : cookies) {
    
    
            if(cookie.getName().equals("username")) {
    
    
              val = cookie.getValue();
            }
        }
      }
      %>
    <form action="/login" method="post">
    用户名:<input type="text" name="uname" value="<%=val%>"><input type="submit" value="登录">
    </form>
  </p>
  </body>
</html>
        
success.jsp
        
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录成功</h1>
<h1>欢迎您:${
    
    loginuname}  <a href="/loginOut">退出</a></h1>
</body>
</html>

6.セッションとCookieの違い

(1)Cookieデータはクライアント側に保存され、セッションデータはサーバー側に保存されます。

(2)セッションは、アプリケーションサーバーによって維持されるサーバー側のストレージスペースです。ユーザーがサーバーに接続すると、サーバーは一意のSessionIDを生成し、サーバー側のセッションストレージスペースにアクセスするための識別子としてSessionIDを使用します。SessionIDデータはクライアントに保存され、Cookieとともに保存されます。ユーザーがページを送信すると、SessionIDがサーバーに送信されてSessionデータにアクセスします。このプロセスは、開発者の介入を必要としません。したがって、クライアントがCookieを無効にすると、セッションも無効になります。

(3)Cookieは一種のSessionオブジェクトです。ただし、違いがあります。Cookieはサーバーリソースを占有しませんが、クライアントメモリまたはCookieのテキストファイルに保存されますが、Sessionはサーバーリソースを占有します。したがって、セッションを使用せず、Cookieを使用しないようにしてください。ただし、一般的にCookieは信頼できないと考えられています。Cookieはこのマシンに保存されますが、Cookieの情報が完全に表示され、ローカルで簡単に編集できるため、多くのセキュリティ問題が発生する可能性があります。セッションは信頼できます。しかし、今では多くの有名なサイトもCookieを使用しています。

フィルタ

1.フィルターとは

フィルタは実際にWebリソースをインターセプトし、何らかの処理を行ってから、処理のために次のフィルタまたはサーブレットに渡します。通常、フィルタは処理要求をインターセプトするために使用され、返された応答もインターセプトできます。
ここに画像の説明を挿入

import javax.servlet.*;

2.フィルターの構文形式

2.1.Filterインターフェースを実装するためのクラスを作成します

public class CharSetFilter implements Filter{
    
    }

2.2。インターフェースのメソッドを書き換える

public void destroy() {
    
     //销毁的方法}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws
ServletException, IOException {
    
    
        //过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理
        chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
    
    
/*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
}

2.3.web.xmlファイルで構成します

<filter>
    <filter-name>过滤器名称</filter-name>
    <filter-class>过滤器所在的路径</filter-class>
</filter>
<filter-mapping>
    <filter-name>过滤器名称</filter-name>
    <url-pattern>需要过滤的资源</url-pattern>
</filter-mapping>

3.使用シナリオ

3.1。ユーザーがログインせずに後続の操作を実行できないようにする方法

文字列名=(文字列)session.getAttribute( "キー");

if(name == null){

//ログインページにジャンプします

}

3.2。エンコード方法を設定する-エンコードを均一に設定する

3.3。暗号化と復号化(パスワードの暗号化と復号化)

3.4。違法なテキストスクリーニング

3.5。ダウンロードされたリソースの制限フィルターの特性:サーブレットの前後に実行されます

リスナー

1.リスナーとは

リスナーは、ドメインオブジェクトの状態変化を監視するコンポーネントリスナーの関連概念です。イベントソース:監視対象のオブジェクト(3つのドメインオブジェクト要求、セッション、およびservletContext)リスナー:イベントソースオブジェクト、イベントの状態を監視します。ソースオブジェクト変更により、リスナーはリスナーを登録します:リスナーをイベントソースにバインドします。応答動作:リスナーがイベントソースの状態変化を監視するときに関係する機能コード(プログラマーによって記述されたコード)

2.リスナーの分類

最初のディメンションは、監視対象のオブジェクト(ServletRequestドメイン、HttpSessionドメイン、およびServletContextドメイン)に従って分割されます。2番目のディメンションは、監視の内容(監視ドメインオブジェクトの作成と破棄、および属性の変更)に従って分割されます。ドメインオブジェクトの監視

ここに画像の説明を挿入

3.3つの主要なドメインオブジェクトの作成と破棄を監視するリスナー

リスナーの準備手順(強調):

web.xml-registrationで構成する必要があるリスナーメソッドをカバーするリスナーインターフェイスを実装するリスナークラスを記述します。

<listener>
	<listener-class>监听器所在的路径</listener-class>
</listener>
ServletContextListener
监听ServletContext域的创建与销毁的监听器

Servlet域的生命周期
何时创建:服务器启动创建 何时销毁:服务器关闭销毁

ServletContextListener监听器的主要作用
初始化的工作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化) 加载一些初始化的配置文件
(spring的配置文件) 任务调度(定时器—Timer/TimerTask)

HttpSessionListener
监听Httpsession域的创建和销毁的监听器

HttpSession对象的生命周期
何时创建:第一次调用request.getSession时创建 何时销毁:服务器关闭销毁、session过期(默认30分钟,修改
默认的30分钟是在Tomcat的web.xml,修改当前项目的过期时间是在自己项目的web.xml中)、手动销毁

HttpSessionListener监听器的主要作用:
由于每次访问网站都会默认创建session对象(jsp页面中page指令中的session属性默认为true,即被访问时创建
session),可以用于计数网站访问过的人

ServletRequestListener
监听ServletRequest域创建与销毁的监听器

ServletRequest的生命周期
创建:每一次请求都会创建request
销毁:请求结束
用法同上,用处不是很大,此处省略。
HttpSession对象的生命周期
何时创建:第一次调用request.getSession时创建 何时销毁:服务器关闭销毁、session过期(默认30分钟,修改
默认的30分钟是在Tomcat的web.xml,修改当前项目的过期时间是在自己项目的web.xml中)、手动销毁

HttpSessionListener监听器的主要作用:
由于每次访问网站都会默认创建session对象(jsp页面中page指令中的session属性默认为true,即被访问时创建
session),可以用于计数网站访问过的人

ServletRequestListener
监听ServletRequest域创建与销毁的监听器

ServletRequest的生命周期
创建:每一次请求都会创建request
销毁:请求结束
用法同上,用处不是很大,此处省略。

おすすめ

転載: blog.csdn.net/weixin_43515837/article/details/112725708