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クラスコードは次のとおりです.
ユーザーのログインアウトコントローラ:
すべてのソースコードをダウンロードするには、ここをクリックしてください.
いいと思ったら押してください!!ありがとう!
ステータスの追跡と管理,これはユーザ行動分析,ログインシステム設計などの方法に重要な応用がある.はい
ほとんどの現代のブラウザでは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()));
// }
}
すべてのソースコードをダウンロードするには、ここをクリックしてください.
いいと思ったら押してください!!ありがとう!