春に分散セッション管理を実装します
この記事は、主に春に分散セッションを実装し、Redisを使用してセッションを維持します。このようにして、アプリケーションが展開されるとき、樹脂やTomcatなどのコンテナに分散型を構成する必要はありません。これは、クラスター拡張用の新しいノードサーバーを追加するのに便利です。セッションは各ノードのサーバーに依存せず、Redisから直接取得できます。関数のコアコードは次のとおりです。
1.最初にWeb.xmlで構成します
インターセプターに追加:
<! - 配布セッションの開始 - > <filter> <filter-name> distributedsessionfilter </filter-name> <filter-class> distributedsessionFilter </filter-class> <init-param> <! - 必須、キー。 2つの方法、1はBeanに対応し、形式はBean:Keyです。 2文字列、affffrfgv-> <param-name> key </param-name> <param-value> xxxxxxxxx </param-value> </init-param> <init-param> <! - redisに対応するビーンはBean:xx-> <param </param-lamam <param-value> bean:redispersistent </param-value> // distributedbaseinterfaceこのインターフェイスに対応する、セッション永続性操作を実行する</init-param> <init-param> <! - 必須、 - > <param-name> cookiename </param-name> <parm-value> testsessionsid <filter-name> distributedSessionFilter </filter-name> <url-pattern>*
2。インターセプターの実装、コアコードは次のとおりです
主に次のカテゴリがあります。
1。distributedSessionFilterはフィルターを実装しています。
java.io.ioexception; Import java.util.hashmap; import java.util.map; import javax.servlet.filter; Import javax.servlet.filterchain; Import javax.servlet.filterconfig; Import javax.servletectective; import javax.servlet.servletect.servletectective; javax.servlet.servletresponse; Import javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletresponse; Import org.springframework.web.context.webapplicationcontext; Import; org.springframework.web.context.support.webapplicationcontextutils; public class distributedsessionfilter explments filter {private static final logger log = loggerfactory.getLogger(distributedsessionfilter.class);プライベートストリングクッキーネーム; //主にセッションを管理するための操作です。プライベート文字列キー;}コンテナが起動するときの初期化方法:
@Override public void init(filterconfig config)Strows servletexception {webapplicationContext wac = webapplicationContextutils.getRequeiredWebApplicationContext(config.getServletContext());文字列key = config.getInitParameter( "key"); string cookiename = config.getInitParameter( "cookiename"); string cachebean = config.getInitParameter( "cachebean"); // Beanの名前を取得すると、構成は「Bean:」です。 DistributedBaseInterface distributedCache =(distributedbaseInterface)wac.getBean(redisbeanstr); //キーを取得すると、2つの構成メソッドがあり、1はBeanに対応し、形式はBean:keyです。 2 string if(key.startswith( "bean:")){this.key =(string)wac.getbean(key.substring(5)); } else {this.key = key; } this.cookiename = cookiename; this.distributedsessionmanager = distributedsessionmanager.getInstance(distributedCache); //例外処理は省略されています。 。 。 }実際のリクエストインターセプトを実行します:
@Override public void dofilter(servletrequest servletrequest、servletresponse servletResponse、filterchain filterchain)Servletexception、ioexception {distributedhttpservletrequestwrapper distreq = null; try {// procession distreq = createdistributedRequest(servletRequest、servletResponse); filterchain.dofilter(distreq、servletResponse); } catch(throwable e){//省略。 。 。 }最後に{if(distreq!= null){try {//リクエストを処理した後、セッションを処理します(主にセッションセッションの保存)dealsessionafterrequest(distreq.getsession()); } catch(throwable e2){//省略。 。 。 }}}}} //分配要求プライベートdistributedhttpservletrequestwrapper createdistributedRequest(servletrequest servletrequest、servletresponse servletResponse)ioexception、servletexception {httpservletrequest request =(httpserquletrequest)servletrequest; httpservletResponse応答=(httpservletResponse)servletResponse; string usersid = cookieutil.getcookie(cookiename、request); string evertySid = distributedsessionmanager.getActualSid(usersid、request、key); if(stringutil.isblank(everitySid)){if(stringutil.isnotblank(usersid)){log.info( "usersid [{{}]検証fails"、usersid); } // cookie string [] usersidarr = distributedsessionmanager.createusid(request、key); usersid = usersidarr [0]; cookieutil.setcookie(cookiename、usersid、request、response); eversitSid = usersidarr [1]; } evertionSid = "sid:" + evertySid; distributedhttpssessionwrapper distsession = null; try {map <string、object> allattribute = distributedsessionmanager.getSession(everitySid、request.getSession().getMaxinActiveInterval()); distsession = new distributedhttpssessionwrapper(evertySid、request.getSession()、allattribute); } catch(throwable e){//エラーが発生し、キャッシュされたデータlog.error(e.getmessage()、e)を削除しました。 map <string、object> allattribute = new hashmap <string、object>(); distsession = new distributedhttpssessionwrapper(evertySid、request.getSession()、allattribute); distributedsessionmanager.removesession(distessession); } distributedhttpservletrequestwrapper requestwrapper = new distributedhttpservletrequestwrapper(request、distsession); return requestwrapper; } //操作セッションprivate void dealsessionafterrequest(distributedhttpsessionwrapper session){if(session == null){return; } if(session.changed){distributedsessionmanager.savesession(session); } else if(session.invalidated){distributedsessionmanager.removesession(session); } else {distributedsessionmanager.expire(session); }}2。分散型セッションマネージャー、主に分散セッション、コアコードを扱っています。
class distributedSessionManager {Protected static final logger log = loggerFactory.getLogger(distributedSessionManager.class); private static distributedsessionmanager instance = null; // Redisはセッションインターフェイスを処理し、プライベートディストリビューエンテッドベースインターフェイスdistributedBaseInterfaceを実装します。 private static byte [] lock = new byte [1]; private distributedsessionmanager(distributedbaseInterface distributedbaseInterface){this.distributedbaseInterface = distributedbaseInterface; } public static distributedsessionmanager getInstance(distributedbaseInterface redis){if(instance == null){synchronized(lock){if(instance == null){instance = new distributedsessionmanager(redis); }}} return instance; } //セッションパブリックマップ<string、object> getsession(string sid、int second){string json = this.distributedbaseInterface.get(sid、second); if(stringutil.isnotblank(json)){return jsonutil.unserializemap(json); } new hashmap <string、object>(1)を返します。 } //セッションを保存しますpublic void savessession(distributedhttpssessionwrapper session){map <string、object> map = session.allattribute; if(maputil.isempty(map)){return; } string json = jsonutil.serializemap(map); this.distributedbaseInterface.set(session.getId()、json、session.getMaxinActiveInterval()); } // delete session public void requidessession(distributedhttpssessionwrapper session){distributedbaseInterface.del(session.getId()); } public void expire(distributedhttpssessionwrapper session){distributedbaseInterface.expire(session.getId()、session.getMaxinActiveInterval()); } /** * cookieのsidを作成 * /public string [] createUsersid(httpservletrequest request、string key){// ...} public string getActualSid(string usersid、httpservletrequest request、string key){// ...}}}}3。DistributeDhttpssessionWrapperはhttpsessionを実装し、分散セッションパッケージ、コアコードを実行します。
Public Class distributedhttpssessionwrapperはhttpsession {private httpsession orgisession;プライベートストリングシド;ブール変更= false; Boolean Invalidated = false; map <string、object> allattribute; public distributedhttpssessionWrapper(String Sid、httpsession Session、Map <String、object> allattribute){this.orgisession = session; this.sid = sid; this.allattribute = allattribute; } @Override public string getId(){return this.sid; } @Override public void setAttribute(string name、object value){chander = true; allattribute.put(name、value); } @Override public Object getAttribute(string name){return allattribute.get(name); } @Override public Enumeration <String> getAttributEnames(){set <string> set = allattribute.keyset(); iterator <string> iterator = set.iterator();新しいmyEnumeration <String>(iterator)を返します。 }プライベートクラスmyEnumeration <t>列挙<t> {iterator <t> iterator; public myEnumeration(iterator <t> iterator){super(); this.iterator = iterator; } @Override public boolean hasmorelements(){return iterator.hasnext(); } @Override public t nextelement(){return iterator.next(); }} @Override public void invalidate(){this.invalidated = true; } @override public void removeattribute(string name){chander = true; allattribute.remove(name); } @Override public long getcreationTime(){return orgisession.getCreationTime(); } @Override public long getLastaccessedTime(){return orgisession.getLastaccessedTime(); } @Override public int getMaxinActiveInterval(){return orgisession.getMaxinActiveInterval(); } @Override public servletcontext getServletContext(){return orgisession.getServletContext(); } @Override public Object getValue(string arg0){return orgisession.getValue(arg0); } @Override public String [] getValuenames(){return orgisession.getValuenames(); } @Override public boolean isnew(){return orgisession.isnew(); } @Override public void putvalue(string arg0、object arg1){orgisession.putvalue(arg0、arg1); } @Override public void removevalue(string arg0){orgisession.removeValue(arg0); } @Override public void setMaxinActiveInterval(int arg0){orgisession.setMaxinActiveInterval(arg0); } @Override public httpsessionContext getSessionContext(){return orgisession.getSessionContext(); }4。Distributedhttpservletrequestwrapperは、httpservletrequestwrapperを実装し、処理されたセッションと元のリクエスト、コアコードをラップします。
public class distributedhttpservletrequestwrapperは、javax.servlet.http.httpservletrequestwrapper {private httpservletrequest orgirequestを拡張します。 privatedistributedhttpssessionwrapperセッション。 public distributedhttpservletrequestwrapper(httpservletrequest request、distributedhttpsessionwrapper session){super(request); if(session == null){//例外処理。 。 } if(request == null){//例外処理。 。 } this.orgirequest = request; this.session = session; } public distributedhttpssessionwrapper getsession(boolean create){orgirequest.getSession(create);返信セッション。 } public distributedhttpssessionwrapper getsession(){return session; }}5。さらに、distributedbaseInterfaceインターフェイスを定義して、永続性操作のためにRedisにセッションを処理します。
public interface distributedbaseInterface { / ** * key * @param key * @param seconds * / public string get(string key、int秒)に基づいてキャッシュデータを取得します。 / ** * cached data * @param key * @param json * @param seconds */ public void set(string key、string json、int senconds); / ***キャッシュを削除* @param key*/ public void del(string key); / ** *期限切れのデータを設定 * @param key * @param seconds */ public void expire(string key、int秒);注:この記事では、Redisメソッドのみを使用してSpringのセッションを管理し、コンテナなどの構成など、他にも多くの実装方法があり、セッションを作成するルーティングアルゴリズムを設計します。クラスター、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、,,,,,,,,,,,,,,,,,,,,ordddロししたりします。 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、,,,,,,,,,,,,,,,,,,,,,orddd型のの] 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、,,,,,,,,,,,,,,,,,,,,,orddd型のの] 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、,,,,,,,,,,,,,,,,,,,,,orddd型のの]
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。