RFC 6265(HTTP状態管理プロトコル)に基づく簡単なログインシステムを実現


このプロトコルは主にHTTP CookieとSetCookieヘッダフィールドを用いてHTTP Requestを実現する方法を述べる
ステータスの追跡と管理,これはユーザ行動分析,ログインシステム設計などの方法に重要な応用がある.はい
ほとんどの現代のブラウザではRFC 6265がサポートされている.
基本原理:
RFC 6265は、HTTPResponseでSetCookieの異なる値を設定することによって、ブラウザクライアントに
次のリクエストリクエストRequest Headerには、Responseで指定した値と動作が付きます.サーバまで
構成のセッションが期限切れになるまで.Tomcatでsessionの有効期限を30分に設定し、web.xmlで構成します.
ファイルには、このプロパティ値を書き換えることができます.同時に、ユーザーがブラウザを閉じた後、クライアントメモリにサイトを保存します.
のクッキーの内容は自動的に破棄されます.ユーザーの都合が悪いためか、多くのサイトが自分のアカウントを覚えることを提供しています.
号の理由は、実はクッキーをローカルファイルに書くことです.
システムアクセスとログインページへのリダイレクト
まず、ブラウザクライアントが指定されたURLまたはWebサーバへのアクセスを要求するRequest要求を開始すると、サーバは
エンドは、要求ヘッダにCookieフィールドが含まれているかどうか、およびCookieフィールドの内容が含まれているかどうかを確認することによって、別のアクセス者が
ログインまたはログインしていないユーザのために、ログインしていないページであれば、URLをログインページにリダイレクトすればよい.ユーザー
ログイン後、サーバー側がHTTP Response+Set-Cookieコンテンツをクライアントブラウザに送信すると、
その後、Domainに送信されたすべてのURLに、Set-Cookieで指定された内容、HTTPが添付されます.
Request+Cookieはサーバ側に、サーバ側はRequestヘッダのCookieコンテンツをチェックすることで
ユーザの状態追跡.無状態HTTP Requestを状態のあるHTTP接続にする
管理する.ログイン処理の基本フローチャートは以下の通りです.
サーバとクライアントHTTP Requestの送信と承認状態:
ユーザ終了システムとRequest状態終了
クライアントがブラウザを閉じると、クライアントCookieは自動的にメモリから破棄され、クライアントが再び
ブラウザを開いてサーバ側リソースを要求すると、サーバ側に再ログインして新しい追跡可能な
Requestセッションは、サーバ側が設定したセッション時間を超えると、ユーザーにシステムへの再ログインが要求されます.
ユーザがシステム終了機能を使用して正常に終了した場合、終了時にMax-Ag:0を設定することでremove
現在のクッキーコンテンツは、クライアントステータスのクリアを実現します.HTTP ResponseにCookieを付けると
期間プロパティは、過去の時間を同時に設定します.例は次のとおりです.
RFC 6265におけるCookieとSetCookieの属性と使用の詳細
Cookie
SetCookie
HTTP Request Headerに含まれ、ユーザークライアントはサーバー側に検証情報とその他の有用な情報を送信し、主にクライアントの状態を追跡し、ユーザーの行為を分析するために使用する.
HTTP Responseでは、主にサーバ側がクライアントに指定した状態情報を送信し、クライアントとの連絡を確立するために使用される.HTTPOnlyプロパティとSecureプロパティを設定することで、クライアントCookieデータを保護し、悪意のあるユーザーCookie情報の読み取りを減らすことができます.
RFC 6265の簡単な例:
==サーバ->UserAgent=//サーバクライアントへ送信
Set-Cookie:SID=31d4d96e407aad42
==User Agent->Server=//各リクエストにSID情報が付き、ユーザーステータスの追跡が可能
Cookie: SID=31d4d96e407aad42
クライアントに要求されたすべての要求パスにSID情報を持ち込み、Path=/実装を送信する
== Server -> UserAgent ==
Set-Cookie:SID=31d4d96e407aad42; Path=/; Domain=example.com
== User Agent ->Server ==
Cookie: SID=31d4d96e407aad42
クライアントRequest CookieのSID情報を削除し、現在時刻以前の任意の時刻を取得します.
== Server -> UserAgent ==
Set-Cookie: SID=;Expires=Sun, 06 Nov 1994 08:49:37 GMT
最後に私が捕まえたCSDNログイン後のCookie情報を見てみましょう.
J 2 EE HTTPサーブレットRequestからSessionID取得メソッドを呼び出すと自動的にJESSIONIDが
CookieとしてResponseヘッダに設定します.明示的に再呼び出す必要はありません!
RFC 6265の内容によって、Spring 3 MVCに基づいて私自身も1つの簡単な登録システムの設計を実現しました
合意をよりよく理解するのに役立ちます.2ページのみ、2つのControllerクラスと1つのサーブレットFilter
各クラスの役割は大体以下の通りです.
サーブレットFilterクラス:HTTP Requestヘッダの検査を実現し、ユーザーの状態を追跡する
2つのControllerクラス:1つはユーザーのログインを管理するために使用され、1つはホームページの情報を簡単に取得するために使用されます.
サーブレットFilterクラスコードは次のとおりです.
package com.edinme.exam.filter; 
            
import java.io.IOException; 
import java.util.Date; 
            
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.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
            
import com.editme.exam.util.FilterUtil; 
            
public class SingleSignOnFilter implements Filter{  
    @Override 
    public void destroy() { 
        // TODO Auto-generated method stub 
    } 
            
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException { 
        HttpServletRequest httpRequest = (HttpServletRequest) request; 
        HttpServletResponse httpResponse = (HttpServletResponse) response;   
        String ipAddress = httpRequest.getRemoteAddr(); 
                    
        // get URI resource path 
        String uriPath = httpRequest.getRequestURI(); 
        String contextPath = httpRequest.getContextPath(); 
        String cookie = httpRequest.getHeader("Cookie"); 
        String sessionId = httpRequest.getSession().getId(); // enable SetCookie header in HTTP Response 
        if(FilterUtil.validURLRequest(uriPath, cookie, contextPath, sessionId)) 
        { 
            System.out.println("Request URI : " + uriPath); 
            System.out.println("IP "+ipAddress + ", Time " + new Date().toString()); 
            chain.doFilter(request, response); 
        } 
        else 
        {        
            System.out.println(httpRequest.getProtocol() + httpRequest.getLocalPort() + httpRequest.getContextPath()); 
            httpResponse.sendRedirect("/exam/user.do"); 
        } 
    } 
            
    @Override 
    public void init(FilterConfig config) throws ServletException { 
        // TODO Auto-generated method stub 
                    
    } 
            
}

ユーザーのログインアウトコントローラ: 
package com.edinme.exam.controller; 
      
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
      
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.servlet.ModelAndView; 
      
import com.edinme.exam.dto.MockUpDataFactory; 
import com.edinme.exam.dto.UserDto; 
import com.editme.exam.util.FilterUtil; 
      
@Controller 
@RequestMapping(value = "/user") 
public class UserLoginController { 
          
    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView goLoginPage() 
    { 
        System.out.println("Dispaly SSO Page"); 
        ModelAndView view = new ModelAndView("user"); 
        return view; 
    } 
          
    @RequestMapping(value = "signIn", method = RequestMethod.GET) 
    @ResponseBody 
    public UserDto login(@RequestParam String userId, @RequestParam String password, /*HttpServletRequest httpRequest,*/ HttpServletResponse response) 
    { 
        System.out.println("User Name = " + userId); 
        MockUpDataFactory dataFactory = new MockUpDataFactory(); 
        response.addHeader("Set-Cookie", "userId=" + userId + "; Path=" + FilterUtil.CONTEXT_PATH + "; HttpOnly"); 
        return dataFactory.getUserById(userId); 
    } 
          
    @RequestMapping(value = "signOut", method = RequestMethod.GET) 
    @ResponseBody 
    public UserDto logout(@RequestParam String userId, HttpServletRequest httpRequest, HttpServletResponse response) 
    { 
        MockUpDataFactory dataFactory = new MockUpDataFactory();     
        //  Set-Cookie:JSESSIONID=delete; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/exam/ 
        //  Set-Cookie:userId=delete; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/exam/ 
        Cookie[] cs = httpRequest.getCookies(); 
        for(Cookie c : cs) 
        { 
            c.setMaxAge(0); // set expire attribute 
            c.setValue("delete"); 
            c.setPath(FilterUtil.CONTEXT_PATH); // set path, must be same as login context path 
            response.addCookie(c);           
        } 
        response.setHeader("Expires", "Thu, 19 Nov 1981 08:52:00 GMT"); // must be GTM format 
        return dataFactory.getUserById(userId); 
    } 
//   
//  public static void main(String[] args) 
//  { 
//      SimpleDateFormat sdf = new SimpleDateFormat("E dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); 
//      sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
//      System.out.println(sdf.format(new Date())); 
//  } 
      
}

すべてのソースコードをダウンロードするには、ここをクリックしてください.
いいと思ったら押してください!!ありがとう!