2012-10-29 18 views
6

का उपयोग कर एप्लिकेशन मैं लॉगिन (मुझे याद रखें) एप्लिकेशन को लागू करने की कोशिश कर रहा हूं, और मुझे कुकीज़ प्रबंधित करने में कोई समस्या है। जब मैं रजिस्टर कर रहा हूँ (नए सदस्यों के लिए) या लॉगिन मैं सर्वर में कर रहा हूँ (सदस्यों को बताया कि पहले से ही पंजीकृत किया गया है के लिए):लॉगिन, मुझे याद रखें, जावा सर्वलेट और जेएसपी

Cookie returnVisitorCookie = new Cookie("repeatVisitor", "yes"); 
returnVisitorCookie.setMaxAge(60*60*24*365); // 1 year 
response.addCookie(returnVisitorCookie); 

जहां प्रतिक्रिया मैं ब्राउज़र से हो रही है। उदाहरण के लिए: visitor.login (प्रतिक्रिया)।

जब मैं साइन कर रहा हूं, तो मैं कुकी को हटा रहा हूं। लेकिन ऐसा लगता है कि मेरे पास अधिक कुकीज़ है जो यह होना चाहिए, मेरा मतलब है कि अगर मैंने 2 सदस्यों और साइनआउट पंजीकृत किए हैं, तो मेरे पास अभी भी नाम = "repeatVisitor" और value = "yes" के साथ कुकीज़ है।

शायद क्योंकि मैं कुकी को विभिन्न respones में कुकी डाल रहा हूं।

कोई मुझे एक idae दे सकता है जो मैं गलत कर रहा हूं और मुझे इसे कैसे लागू करना चाहिए? धन्यवाद

+1

मदद करता है यदि आप इस कुकी को सेट कर रहे हैं, तो आप लॉग इन किए बिना दो उपयोगकर्ताओं को कैसे पंजीकृत कर सकते हैं? ऐसा लगता है कि आप इसे अनसेट करने से पहले इसे कई बार सेट कर रहे हैं, जो संभव नहीं होना चाहिए - यह इंगित करेगा कि आप लॉग इन कर रहे हैं जब आप पहले से लॉग इन हैं। –

+2

@PWhite अगर आप पहले से लॉग इन करते समय लॉग इन कर रहे थे, तो उपर्युक्त कोड केवल मौजूदा कुकी को ओवरराइट करेगा। – doublesharp

+0

मैं परिचित नहीं हूं कि जावा कुकीज़ के साथ कैसे काम करता है, इसलिए मैंने जवाब नहीं पोस्ट किया है। मुझे पता है कि यह अन्य बैकएंड भाषाओं में सच है। –

उत्तर

0

आपको कम से कम एक साल के लिए अनुवर्ती अनुरोधों में repeatVisitor कुकी वर्तमान होने रहेंगे, आप ग्राहक के ब्राउज़र के निर्देश दिए गए हैं सिर्फ इतना है कि ऐसा करने के लिए, "कुकी एक वर्ष के लिए जीवित रखने के"। बाद के अनुरोध हेडर से कुकी को हटाने से ब्राउज़र को इसे फिर से जोड़ने से नहीं रोका जाएगा।

लागू करने के लिए सफलतापूर्वक मुझे याद है, आप

  1. करने की जरूरत है एक सुरक्षित टोकन, न सिर्फ एक ध्वज है कि कहते हैं, "दोहराने उपयोगकर्ता: हाँ" का प्रयोग करें। java's UUID class की तरह कुछ का उपयोग कर विशिष्ट सुरक्षित रूप से एक आगंतुक की पहचान के लिए एक अनूठा टोकन जेनरेट करें, ताकि किसी को सिर्फ एक अनुरोध रोकना नहीं करता है और शीर्षक में कुछ डाल आप

  2. सक्रिय से निपटने के लिए के लिए प्रबंधन सुरक्षित टोकन आप प्रति उत्पन्न उपयोगकर्ता। इसका मतलब है कि आप कुछ लगातार स्टोरेज में जेनरेट किए गए टोकन को स्टोर करते हैं और इस स्टोर के खिलाफ अनुरोध दोहराते हैं। यह इस स्टोर के भीतर है कि आप टोकन की समाप्ति और आगे का प्रबंधन करेंगे। तो अपने लगातार दुकान में, आप झंडा निशानी के रूप में निष्क्रिय कर सकते हैं या समाप्त हो

वैकल्पिक रूप से, आसान मुझे याद मार्ग स्थापित करने के लिए है अपने याद मुझे एक निश्चित समय अवधि है जिसके लिए आप अब सेट करेंगे करने के लिए HttpServletRequest ऑब्जेक्ट में कुकी समाप्ति दिनांक। यही है, आपके पास remember me for 2 weeks कहकर आपका चेक बॉक्स होगा और फिर अपनी कुकी की समाप्ति 2 सप्ताह तक सेट करें। एक ही कुकी टोकन के बाद के प्रतिनिधित्व स्वचालित रूप से तनाव के बिना प्रबंधित किया जाएगा।

1

मुझे कभी-कभी एक उदाहरण देखकर सीखने या समझने का सबसे अच्छा तरीका मिल जाता है।

@WebServlet(name = "Login", urlPatterns = {"/authorization/Login"}) 
public class Login extends HttpServlet { 

    /** 
    * Processes requests for both HTTP 
    * <code>GET</code> and 
    * <code>POST</code> methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 

     PrintWriter out = response.getWriter(); 
     try { 
      System.out.println("Reached login"); 
      if (!Authorization.isLoggedIn(request)) { 
       String login = request.getParameter("login"); 
       String password = request.getParameter("password"); 
       boolean remember = Boolean.parseBoolean(request.getParameter("remember")); 

       System.out.println("Reached login "+login+", "+password+","+remember); 
       if (!Authorization.validateLogin(login, password)) { 
        Logger.getLogger(Login.class.getName()).log(Level.INFO, 
          "Failed login (invalid password) from {0} for {1}", 
          new String[]{request.getRemoteAddr(), login}); 
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid username or password!"); 
        return; 
       } 
       //So far so good... Get the user object from the database (unique login names) 
       DB_User user = DB_User.get(login); 
       if (!user.getActive()) { 
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Your account is no longer active!"); 
        return; 
       } 
       String sessionID = Authorization.createNewSession(user, request.getRemoteAddr(), remember); 
       Cookie sessionCookie = new Cookie("my_application.session_id", sessionID); 
       sessionCookie.setDomain(request.getServerName()); 
       sessionCookie.setPath(request.getContextPath()); 
       if (remember) { 
        sessionCookie.setMaxAge(ServerConfig.getLoginSessionTimeout()); 
       } 

       response.addCookie(sessionCookie); 
      } 
      response.sendRedirect("/app/myAccount.jsp"); 
     } catch (Throwable ex) { 
      Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); 
      ServletUtils.handleException(ex, response); 
     } finally { 
      out.flush(); 
      out.close(); 
     } 
    } 

    // +HttpSerlet default methods here. (doGet, doPost, getServletInfo) 
} 

लॉगआउट सर्वलेट उदाहरण: यहाँ कुछ कोड हम एक काम वेबसाइट के लिए उपयोग है

@WebServlet(name = "Logout", urlPatterns = {"/authorization/Logout"}) 
public class Logout extends HttpServlet { 

    /** 
    * Processes requests for both HTTP 
    * <code>GET</code> and 
    * <code>POST</code> methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      String sessionID = ServletUtils.getCookieValue(request.getCookies(),"my_application.session_id"); 

      if (sessionID != null) { 
       SQLManager sql = ServerConfig.getSql(); 
       sql.deleteFromTable("login_session", "session_id = " + SQLString.toSql(sessionID)); 

       Cookie sessionCookie = new Cookie("my_application.session_id", null); 
       sessionCookie.setDomain(ServletUtils.getCookieDomain(request)); 
       sessionCookie.setPath("/you_app_name"); 
       sessionCookie.setMaxAge(0); 
       response.addCookie(sessionCookie); 
      } 
      response.sendRedirect("/security/login.jsp"); 

     } catch (Throwable ex) { 
      Logger.getLogger(Logout.class.getName()).log(Level.SEVERE, null, ex); 
      ServletUtils.handleException(ex, response); 
     } finally { 
      out.close(); 
     } 
    } 
} 

कुछ सहायक वर्ग के रूप में आप देखेंगे हमारे द्वारा किए गए हैं लेकिन अवधारणा वहाँ फिर भी है। उम्मीद है कि यह

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