2011-06-02 14 views
12

मैं अपने जावा वेब एप्लिकेशन में थ्रेडलोकल चर के साथ शोध और प्रयोग कर रहा हूं। मैं अनुरोध से पहले उपयोगकर्ता नाम (सत्र से एकत्रित) को संग्रहीत करने के लिए थ्रेडलोकल चर का उपयोग कर रहा हूं, और उसके बाद अनुरोध के बाद इसे हटा रहा हूं। मैंने ServletFilter में एक स्थिर उपयोगिता विधि को कॉल करके ऐसा किया है। कारण मैं सत्र से उपयोगकर्ता नाम को पुनः प्राप्त नहीं करता क्योंकि यह मुझे लंबे समय से चलने वाली प्रक्रियाओं के साथ एक सिस्टम विरासत में मिला है जो कभी-कभी सत्र टाइमआउट की तुलना में चलाने में अधिक समय लेता है। मेरा विचार है कि अनुरोध संसाधित होने से पहले उपयोगकर्ता नाम को पकड़ना है और इसे थ्रेडलोकल चर में संग्रहीत करना है, इस प्रकार मुझे अनुरोध की अवधि में उपयोगकर्ता नाम तक पहुंच प्रदान करना है, भले ही इसमें 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(); 
} 
} 

यहाँ मेरी सर्वलेट अनुरोध से पहले उपयोगकर्ता नाम सेट (और अंत में अनुरोध के बाद ब्लॉक के माध्यम से यह स्पष्ट) के लिए इस्तेमाल किया फिल्टर है।

<!--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> 

कोई भी विचार बहुत सराहना कर रहे हैं :)

+0

मैं लंबे समय से चल रहा है बात करते हैं और सर्वलेट सूत्र में उपयोगकर्ता संचार करने के लिए एक अतुल्यकालिक धागा शुरू करने के लिए सलाह देते हैं। –

उत्तर

7

यह वास्तव में धागा करने के लिए सुरक्षा जानकारी संलग्न के लिए एक बहुत ही आम दृष्टिकोण है:

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 विन्यास है निष्पादन (या किसी अन्य निष्पादन से संबंधित जानकारी)।

इसका उपयोग जावा ईई सर्वरों में आंतरिक रूप से और तृतीय पक्ष कोड/यूटिल्स द्वारा वसंत की तरह भी किया जाता है।

यह ठीक काम करेगा।

+0

सूचना सत्यापित की गई। धन्यवाद! – javagruffian