1

JavaScriptでユーザーのタイムゾーンを確実に判断する必要があります。ユーザーベースの大部分は低帯域幅で古いブラウザを使用するため、下位互換性を維持し、データ転送を最小限に抑える必要があります。理想的には、セッションの開始時にのみユーザーのタイムゾーンを取得し(ログインにCASを使用するため、ログインページはありません)、データベースに保存できるサーバーに送り返します。jsTimezoneDetectライブラリとさまざまなジオロケーションAPI(ユーザーのIPによってロケーション/タイムゾーンを取得するため)を調べましたが、それぞれに欠点があります。

  1. jsTimezoneDetectは大きくはありませんが、すべてのページに5Kの余分なJSコードを含めたくありません(単一のログインページはありません!)
  2. ジオロケーションAPI(IPInfoDBなど)は外部サービスへの依存を導入し、低速になる可能性があり、常に結果を保証するとは限りません

ユーザーのタイムゾーンを確実かつ効率的に決定し、最小の帯域幅とブラウザーのリソースを使用してJSFアプリに送り返す最も簡単な方法は何ですか?

4

1 に答える 1

0

コメントを読んだ後、次のコードになりました。

<h:panelGroup layout="block" rendered="#{!applicationBean.timeZoneSet}">
    <h:outputScript name="timezone.js" library="js"></h:outputScript>
    <h:form style="display:none;">
        <p:inputText value="#{applicationBean.currentTimeZone}" widgetVar="wTZ" style="display:none;"></p:inputText>
        <p:remoteCommand autoRun="true" name="setTZ" onstart="var tzone=jstz.determine();wTZ.getJQ().val(tzone.name())" process="@form"></p:remoteCommand>
    </h:form>
</h:panelGroup>  

バッキング Bean:

public boolean isTimeZoneSet() {
    return getELValue(EL_TIMEZONE_FLAG, Boolean.class);
}

public void setTimeZoneSet(boolean val) {
    setELValue(EL_TIMEZONE_FLAG, val);
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void setCurrentTimeZone(String val) {
    User _user = getCurrentUser();
    _user.setTimeZone(val);
    _usersDAO.merge(_user);
    setTimeZoneSet(true);
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public String getCurrentTimeZone() {
 User _user = getCurrentUser();
     return _user.getTimeZone();
    }

ここで、EL_TIMEZONE_FLAG はセッション スコープの EL 式です。上記のアプローチにより、ユーザーにタイムゾーンが設定され、セッションごとに1回だけ実行され、追加のJSコードもセッションごとに1回だけロードされます

于 2013-02-19T18:48:26.587 に答える