2012-10-04 23 views
8

मैं स्प्रिंग सिक्योरिटी का उपयोग कर रहा हूं और सोच रहा हूं कि स्रोत पृष्ठ पर सफल लॉगिन के बाद मैं पुनर्निर्देशन कैसे कार्यान्वित कर सकता हूं यदि उस पृष्ठ में # (हैश) चिह्न है।लॉगिन के बाद # (हैश) चिह्न वाले पृष्ठ पर रीडायरेक्ट करें

अभी मैं always-use-default-target="false" का उपयोग करता हूं और यह यूआरएल प्रकार: /path/to/page/ पर ठीक काम करता है।

लेकिन जब यूआरएल #/path/to/page पर आता है तो यह कोई पुनर्निर्देशन नहीं करता है।

क्या इसे ठीक करने का कोई तरीका है?

$(document).ready(function(){ 
    $('#auth-form').submit(function() { 
    var el = $(this); 
    var hash = window.location.hash; 
    if (hash) el.prop('action', el.prop('action') + '#' + unescape(hash.substring(1))); 
    return true; 
    }); 
}); 

यह स्निपेट प्राधिकरण फार्म की कार्रवाई विशेषता और स्प्रिंग के लिए हैश addes आप एक तरह से URL पर रीडायरेक्ट: #/path/to/page बिना किसी समस्या के

+0

क्या आप उदाहरण पथ –

+0

प्रदान कर सकते हैं मैंने इसे प्रश्न में किया:/path/to/page/और #/path/to/पृष्ठ – nKognito

+0

[आप सर्वर पक्ष पर हैश का उपयोग नहीं कर सकते] [http: // stackoverflow। com/प्रश्न/317,760/कैसे करने वाली मिलता-यूआरएल-हैश-से-सर्वर साइड)। – Xaerxess

उत्तर

11

यहाँ समाधान मैं अंत में इस्तेमाल किया है।

+2

वसंत बैकएंड के साथ कोणीय-जेएस का उपयोग करते हुए यह बहुत अच्छा काम करता है। धन्यवाद! –

2

शायद यह पुराना सवाल है, लेकिन इस विषय में मेरे हालिया शोध के दौरान, मैंने पाया कि समस्या आम है और अभी भी मौजूद है (विशेष रूप से बैक-एंड सुरक्षा के साथ आधुनिक एंगुलरजेएस फ्रंट एंड ऐप्स के मामले में)। मैं आपके साथ अपना समाधान साझा करना चाहता हूं।

प्रवेश पृष्ठ पर, जैसे, /login.html, निम्नलिखित कोड </body> टैग से पहले डाल:

<script type="text/javascript"> 
    var hash = window.location.hash; 
    document.cookie="hashPart=" + window.btoa(hash); 
</script> 

नोट (1): btoa() फ़ंक्शन IE में काम करता है> = 10 (http://www.w3schools.com/jsref/met_win_btoa.asp), पुराने ब्राउज़र के लिए jQuery समकक्ष का उपयोग करें।

नोट (2): यूआरएल के # भाग का एन्क्रिप्शन आवश्यक है क्योंकि इसमें विशेष वर्ण हो सकते हैं, जिन्हें कुकी वैल्यू स्ट्रिंग में संग्रहीत करने की अनुमति नहीं है।

सर्वर पक्ष से आपको AuthenticationSuccessHandler इंटरफ़ेस को लागू करने वाले वर्ग की विधि को संशोधित करना होगा।

मेरे मामले में, मैं बस SavedRequestAwareAuthenticationSuccessHandler कक्षा का विस्तार करता हूं और onAuthenticationSuccess विधि को मूल कोड का उपयोग करके ओवरराइड करता हूं। फिर मैं अनुरोध से हैशपार्ट कुकी मान प्राप्त करता हूं, इसे डीकोड करता हूं और हल किए गए रीडायरेक्ट URL में जोड़ता हूं। मेरे कोड टुकड़ा नीचे:

@Override 
public void onAuthenticationSuccess(HttpServletRequest request, 
     HttpServletResponse response, Authentication authentication) 
     throws ServletException, IOException { 

    // ... copy/paste original implementation here, until ... 

    // Use the DefaultSavedRequest URL 
    String targetUrl = savedRequest.getRedirectUrl(); 

    for (Cookie cookie : req.getCookies()) { 
     if (cookie.getName().equals("hashPart")) { 
      targetUrl += new String(Base64Utils.decodeFromString(cookie.getValue())); 
      cookie.setMaxAge(0); // clear cookie as no longer needed 
      response.addCookie(cookie); 
      break; 
     } 
    } 

    getRedirectStrategy().sendRedirect(request, response, targetUrl); 
} 

अंत में, बस अपनी सफलता हैंडलर वर्ग अपने स्प्रिंग सुरक्षा विन्यास के लिए, में वर्णित के रूप इंजेक्षन: https://stackoverflow.com/a/21100458/3076403

मैं आगे अपनी टिप्पणी या इस समस्या का अन्य समाधान की तलाश कर रहा हूँ।

संबंधित मुद्दे

 संबंधित मुद्दे