2009-06-25 20 views
25

द्वारा जेनरेट किए गए सभी यूआरएल में जेएसएशनिड हुआ है, मुझे कुछ अजीब बग मिला है: जब मैं कुछ ब्राउज़र में पहली बार पृष्ठ खोलता हूं तो सभी संदर्भों में jsessionid पैरामीटर (जैसे <a href="/articles?name=art&jsessionid=5as45df4as5df"..>) होता है।जेएसएल <c:url..> टैग

जब मैं F5 दबाएँ या किसी अन्य तरीके का और सामान गायब हो गया है द्वारा पृष्ठ ताज़ा करें और सब कुछ ठीक काम करता है जब तक मैं अपना ब्राउज़र बंद (और सभी टैब भी बंद किया जाना चाहिए)। जब मैं इसे फिर से खोलता हूं तो मुझे यह अजीब jsessionid पैरामीटर दिखाई देता है।

मैं किए गए सभी URL बनाने के लिए JSTL <c:url..> टैग का उपयोग करें।

मैं कुछ समय पहले कि jsessionid कुकीज़ के लिए एक विकल्प है यदि कुकी अक्षम हैं, लेकिन कुकी सक्षम हैं और मैं वास्तव में कुकीज़ का उपयोग नहीं करते पढ़ा है।

उत्तर

34

यह एक बग नहीं है, यह डिजाइन द्वारा है। जब कोई नया सत्र बनाया जाता है, सर्वर क्लाइंट या कुकीज़ का समर्थन करता है नहीं, और इसलिए यह एक कुकी के साथ-साथ यूआरएल पर jsessionid जेनरेट करती है यकीन नहीं है। जब ग्राहक दूसरी बार वापस आ जाता है, और कुकी प्रस्तुत करता है, तो सर्वर जानता है कि jsessionid आवश्यक नहीं है, और शेष सत्र के लिए इसे छोड़ देता है। यदि ग्राहक कोई कुकी के साथ वापस आता है, तो सर्वर को jsessionid पुनर्लेखन का उपयोग जारी रखने की आवश्यकता है।

आप स्पष्ट रूप से कुकीज़ का उपयोग नहीं कर सकते हैं, लेकिन आप एक सत्र परोक्ष है, और कंटेनर है कि सत्र को ट्रैक करने की जरूरत है।

+0

यह अच्छा है, लेकिन मेरा सभी सीएसएस "लिंक rel =" .. "href ="/mysite/css/styles.css? Jsessionid = as2dfs4df "जैसा दिखता है। क्या मैं इस डिफ़ॉल्ट व्यवहार को बंद कर सकता हूं या यह एक खराब अभ्यास होगा और मुझे अपने सीएसएस लोडिंग को ठीक करना चाहिए? – Roman

+2

यह निर्भर है कि आप किस कंटेनर पर – skaffman

0

दुर्भाग्यवश मुझे इसके आसपास एकमात्र तरीका मिला है जो आपके एप्लिकेशन में फ़िल्टर जोड़ना है जो jsessionid पैरामीटर को मिटा देगा। यदि आप सार्वजनिक वेबसाइट बना रहे हैं और अपने पृष्ठों को अनुक्रमणित करने के लिए वें खोज इंजन चाहते हैं तो यह विशेष रूप से परेशान है।

मुझे विश्वास नहीं है कि टोमकैट (यदि आप इसका उपयोग कर रहे हैं) को आपके यूआरएल में जोड़ने के लिए कॉन्फ़िगर किया जा सकता है। हालांकि मैं अन्य सर्वरों के लिए नहीं कह सकता।

हालांकि, ध्यान दें कि यदि आप फ़िल्टर बनाते हैं और फिर आपको सत्र प्रबंधन की आवश्यकता होती है और उपयोगकर्ता को कुकीज़ बंद कर दी जाती है तो आप समस्याओं में भाग लेंगे।

+0

में चल रहे हैं यह दिलचस्प है कि उसके उदाहरण में यूआरएल में पैरामीटर के रूप में jsessionid है। मैंने पहले नहीं देखा है। टॉमकैट इसे इस रूप में रखता है यूआरएल के लिए एक पोस्टफिक्स (जैसे मेरा/पथ; jsessionid = ... और x = y), जिसे मैंने सोचा था कि सर्वलेट स्पेक की आवश्यकता थी। – skaffman

+0

वास्तव में मैंने गलती की है, यह पैरामीटर नहीं है लेकिन मैं बिल्कुल प्रारूप भूल गया उस पल में – Roman

+0

टॉमकैट 7 का उपयोग इस के लिए किया जा सकता है। टॉमकैट 6.0.30 में यह सुविधा होगी। – Wes

0

एक वैकल्पिक हल <c:url> उपयोग करने के लिए नहीं है, लेकिन ${request.contextPath}/path

+1

बस इसे स्पष्ट करने के लिए - यह '$ {pageContext.request.contextPath} होना चाहिए। – delfuego

4

यहाँ एक Filter के स्वाद में एक बुरा वैकल्पिक हल है, ताकि आप URL में jsessionid कभी नहीं देखेंगे जब भी ग्राहक कुकीज़ का समर्थन करता है का उपयोग करें।

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 
    HttpSession session = req.getSession(); 

    if (session.isNew()) { 
     // New session? OK, redirect to encoded URL with jsessionid in it (and implicitly also set cookie). 
     res.sendRedirect(res.encodeRedirectURL(req.getRequestURI())); 
     return; 
    } else if (session.getAttribute("verified") == null) { 
     // Session has not been verified yet? OK, mark it verified so that we don't need to repeat this. 
     session.setAttribute("verified", true); 
     if (req.isRequestedSessionIdFromCookie()) { 
      // Supports cookies? OK, redirect to unencoded URL to get rid of jsessionid in URL. 
      res.sendRedirect(req.getRequestURI().split(";")[0]); 
      return; 
     } 
    } 

    chain.doFilter(request, response); 
} 

मानचित्र यह /* या जो कुछ भी URL पैटर्न जो सत्र प्रबंधन की आवश्यकता होती है।

+0

हाय बलससी, धन्यवाद जवाब! मैं नहीं करता o वर्तमान में वेब-विकास, लेकिन मैं आपकी पुरानी परियोजनाओं में से एक पर अपना समाधान आजमाऊंगा जिसमें यह समस्या थी। क्या आप एनकोडेड/एन्कोडेड यूआरएल की अवधारणा को थोड़ा (या एक संवाददाता लिंक दे सकते हैं) समझा सकते हैं? यह क्यों मायने रखता है? दूसरी बात जिसके लिए मुझे समझने के लिए ज्ञान की कमी है, सत्र के लिए "सत्यापित" विशेषता है। सामान्य रूप से इसे कब और कब सेट करते हैं? – Roman

+0

स्काफमैन ने यूआरएल में jsessionid की आवश्यकता का उत्तर दिया है। एक बार कुकी समर्थन सत्यापित होने के बाद फ़िल्टर को एक अनंत लूप में चलने से रोकने के लिए 'सत्यापित' attribtue है। आप इसे किसी अन्य चीज़ का नाम बदलने के लिए स्वतंत्र हैं। – BalusC

13

बिलाव 7 पर या किसी सर्वलेट विनिर्देश v3 अनुरूप सर्वर आप अपने आवेदन

<session-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 
+0

यह मेरे लिए टॉमकैट 7 में काम करता है। – Mukus

+5

'c: url' अभी भी इस सेटिंग के साथ 'jsessionid' को जोड़ा जा सकता है। tomcat7/servlet3 – beerbajay

+0

मेरे लिए काम करता है, मैं एम्बेडेड जेटी का उपयोग कर रहा हूं। – Junjie

23

के रूप में की web.xml के लिए निम्न जोड़कर URL में jsessionid निष्क्रिय कर सकते हैं skaffman's answer में बताया गया है, इसकी एक बग नहीं। इसका अनुमानित व्यवहार है।

आपके प्रश्न में jsessionid को पैरामीटर के रूप में जोड़ा गया है, जो मामला नहीं है।

<c:url value="/"/>
का उपयोग करते हुए की तरह निम्नलिखित कुछ उत्पन्न करेगा: /some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FA
तो
<link href="<c:url value="/"/>stylesheets/style.css" rel="stylesheet" type="text/css"/>
का उपयोग कर
/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FAstylesheets/style.css
उत्पन्न होगा, तो अपने सर्वर संसाधन उपलब्ध नहीं मिल रहा।

सबसे अच्छा वैकल्पिक हल है कि मैंने पाया उपयोग <c:url value="/"/> के बजाय ${pageContext.request.contextPath} है। पिछले उदाहरण में तो, आप
<link href="${pageContext.request.contextPath}/stylesheets/style.css" rel="stylesheet" type="text/css"/>
कि
/some/stylesheets/style.css उत्पन्न होगा होगा।

यह समाधान है कंटेनर स्वतंत्र (जबकि सर्वलेट विनिर्देश v3 अनुरूप कंटेनर - बिलाव की तरह - समाधान नहीं है)। प्रतिक्रिया url फ़िल्टरिंग एक हैक की तरह लगता है, क्योंकि आपको एक डिफ़ॉल्ट व्यवहार बदलने की जरूरत है। लेकिन यह सब उस चीज पर निर्भर करता है जो आपको चाहिए और हासिल करना चाहते हैं।

2

यदि आपके पास एक सामान्य रैपर पृष्ठ है जो सभी पेजों का उपयोग करता है (मेरे लिए यह common.inc था) आप सत्र 0 को हटाने के लिए पर session="false" जोड़ सकते हैं।

उदाहरण common.inc

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false" trimDirectiveWhitespaces="true" %> 
<%@ taglib prefix="ab" tagdir="/WEB-INF/tags" %> 

<c:set var="contextPath" scope="request" value="${ pageContext.request.contextPath }" /> 
<c:set var="assetPath" scope="request" value="/assets" /> 
<c:set var="debugEnabled" scope="request" value="${ applicationDebugProperties.debugEnabled }" /> 

वैकल्पिक रूप से .. एक चर के लिए c:url का मान सेट और उत्पादन के लिए चर c:out escapeXml="false" का उपयोग करें और इस sessionid निकाल देंगे।

उदाहरण:

<c:url value=${url} var="image"/> 
<c:out var=${image} escapeXml="false"/> 

वैकल्पिक रूप से, आप इस अपने अपाचे विन्यास को sessionid काटना जोड़ सकते हैं।

ReWriteRule ^/(\w+);jsessionid=\w+$ /$1 [L,R=301] 
ReWriteRule ^/(\w+\.go);jsessionid=\w+$ /$1 [L,R=301]