Java Web アプリケーションで ThreadLocal 変数を調査および実験しています。ThreadLocal 変数を使用して、リクエストの前に (セッションから収集された) ユーザー名を保存し、リクエストの後にそれを削除しています。これは、ServletFilter で静的ユーティリティ メソッドを呼び出すことによって行いました。セッションからユーザー名を単純に取得しない理由は、セッション タイムアウトが許容するよりも実行に時間がかかることがある長時間実行プロセスを持つシステムを継承したためです。私の考えは、リクエストが処理される前にユーザー名を取得し、それを ThreadLocal 変数に格納することです。これにより、15 分以上かかる場合でも、リクエストの期間中はユーザー名にアクセスできます。
私の質問は:
この設計にセキュリティ/パフォーマンスの問題はありますか? もしそうなら、より良い解決策は何ですか? セキュリティやパフォーマンスの問題がない場合でも、より良いアイデアを歓迎します。私のソリューションのスニペットを以下に示します。
これは、フィルタ内およびユーザー名が必要な場所で呼び出されるユーティリティ クラスです。
public abstract class UserUtil {
private static final ThreadLocal<String> threadUser = new ThreadLocal<String>();
public static String getUserId(){
return threadUser.get();
}
public static void setUserId(String userId){
threadUser.set(userId);
}
public static void removeUserId(){
threadUser.remove();
}
}
これは、リクエストの前にユーザー名を設定するために使用されるサーブレットフィルターです(リクエストの後にfinallyブロックを介してクリアします)。
public class UserFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
UserBean userBean = (UserBean) ((HttpServletRequest) servletRequest).getSession().getAttribute("userBean");
UserUtil.setUserId(userBean.getUserId());
filterChain.doFilter(servletRequest, servletResponse);
} finally{
UserUtil.removeUserId();
}
}
}
ここに私の web.xml 構成があります:
<!--web.xml-->
<web-app>
...
...
...
<filter>
<filter-name>UserFilter</filter-name>
<filter-class>filter.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
どんなアイデアでも大歓迎です:)