この記事では、Javaセッションの節約の簡単な実装について説明します。次のように、参照のために共有してください。
ロードバランシングでは、ユーザーが別のマシンにアクセスし、セッションの同期を実行しない場合、ユーザーはユーザーエクスペリエンスに非常に悪いことを求められます。そのため、セッションの同期を実行する必要があります。 Reids Cache Serverにセッションを置くと、問題をうまく解決できます。以下は、コードの簡単な実装です。
1。web.xmlフィルターを構成します:
<filter> <filter-name> sessionfilter </filter-name> <filter-class> org.springframework.web.filter.delegatingfilterproxy </filter-class> </filter> <filter-mapping> <filter-name> sessionfilter </filter-name> <url-pattern>
2。対応するフィルター名を構成します:
<bean id = "sessionfilter"> <プロパティ名= "redistemplate" ref = "redistemplate"/> </bean>
sessionfilterの実装:
public class sessionfilterはgenericfilterbeanを拡張します{private redistemplate redistemplate; @Override public void dofilter(servletRequest request、servletResponse応答、フィルターチェーンチェーン)IoException、servletexception {system.out.println( "filter"); httpservletrequest re =(httpservletrequest)request; httpservletResponse res =(httpservletResponse)応答; terryhttpservletrequestwrapper wrapper = new terryhttpservletrequestwrapper(re、res、redistemplate); Chain.dofilter(ラッパー、応答); } public redistemplate getRedistemplate(){return redistemplate; } public void setRedistemplate(Redistemplate Redistemplate){this.redistemplate = redistemplate; }}4。Terryhttpservletrequestwrapperの実装:
パブリッククラスterryhttpservletrequestwrapperは、httpservletrequestwrapper {private cachehttpsessionセッションを拡張します。プライベートHTTPSERVLETRESPONSE応答。プライベートリデスタンプレートRediStemplate; public terryhttpservletrequestwrapper(httpservletrequest request、httpservletresponse応答、redistemplate redistemplate){super(request); this.redistemplate = response; this.redistemplate = redistemplate; } @Override public httpsesssion getsession(boolean create){if(session!= null){return session; } string sid = "terry" + system.currenttimemillis(); writedtocookie(sid); session = new cachehttpsession(null、sid、redistemplate);返信セッション。 } @override public httpsession getsession(){return getsession(false); } protected void writedtocookie(string sid){cookie mycookies = new cookie( "terry"、sid); mycookies.setmaxage(-1); mycookies.setdomain( "locahost"); mycookies.setPath( "/"); Response.AddCookie(mycookies); }}5。cachehttpsessionの実装:
パブリッククラスのcachehttpsessionはhttpsessionwrapperを拡張します{private string sid;プライベートリデスタンプレートRediStemplate; private stringredisserializer stringserializer = new Stringredisserializer(); public cachehttpsession(httpsession session、string sid、redistemplate redistemplate){super(session); this.sid = sid; this.redistemplate = redistemplate; } @suppresswarnings( "unchecked")@override public enumeration <string> getattributenames(){final byte [] key = stringserializer.serialize(sid); Object result = redistemplate.execute(new rediscallback <object>(){@Override public object doinredis(redisconnection connection)Strows data acccessexception {set <byte []> set = connection.keys(key); return set;}}); if(result!= null){set <byte []> s =(set <byte []>)result; set <string> ss = new Hashset <String>(); for(byte [] b:s){ss.add(stringserializer.deserialize(b)); } enumeration <string> en = new Vector(ss).elements(); return en; } nullを返します。 } @suppresswarnings( "Unchecked")@Override public void setAttribute(string name、object value){final byte [] key = stringserializer.serialize(name); final byte [] v = stringserializer.serialize((string)value); redistemplate.execute(new Rediscallback <Object>(){@Override public object doinredis(redisconnection connection)throws dataaccessexception {connection.set(key、v); return null;}}); } @Override public Object getAttribute(string name){final byte [] key = stringserializer.serialize(name); @suppresswarnings( "unchecked")object value = redistemplate.execute(new rediscallback <object>(){@Override public object doinredis(redisconnection connection)throws dataaccessexception {return connection.get(key);}});返品値。 } @Override public string getId(){return sid; }}6。httpsessionwrapperの実装:
パブリッククラスhttpsessionwrapperはhttpsession {private httpsessionセッションを実装します。 public httpsessionwrapper(httpsession session){this.session = session; } @Override public long getcreationTime(){return this.session.getCreationTime(); } @Override public String getId(){return this.session.getId(); } @Override public long getLastaccessedTime(){return this.session.getLastaccessedTime(); } @Override public servletcontext getServletContext(){return this.session.getServletContext(); } @Override public void setMaxinActiveInterval(int interval){this.session.setMaxinActiveInterval(interval); } @Override public int getMaxinActiveInterval(){return this.session.getMaxinActiveInterval(); } @Override public httpsessionContext getSessionContext(){return this.session.getSessionContext(); } @Override public Object getAttribute(string name){return this.session.getAttribute(name); } @Override public Object getValue(string name){this.session.getValue(name); } @Override public Enumeration <String> getAttributEnames(){return this.session.getAttributEnames(); } @Override public String [] getValuenames(){return this.session.getValuenames(); } @Override public void setAttribute(string name、object value){this.session.setattribute(name、value); } @Override public void putvalue(string name、object value){this.session.putvalue(name、value); } @Override public void removeattribute(string name){this.session.removeattribute(name); } @Override public void removevalue(string name){this.session.RemoveValue(name); } @Override public void invalidate(){this.session.invalidate(); } @Override public boolean isnew(){return this.session.isnew(); }}上記のコードは、セッションをRedisに保存できます。もちろん、SessionIDの生成、過去のセッション、オブジェクトのシリアル化(テストでは便利なために文字列を使用します)、その他多くの問題など、多くの問題があります。時間があれば後で改善します。
Java関連のコンテンツの詳細については、このサイトのトピックをご覧ください:「Java+MySQLデータベースプログラミングの概要」、「Java Operation Excel Skills Summary」、「Javaデータ構造とアルゴリズムのチュートリアル」、「Javaファイルとディレクトリオペレーションスキルの要約」、「Java操作スキルサマリー」
この記事がみんなのJavaプログラミングに役立つことを願っています。