Avatar billede madseksperten Nybegynder
25. februar 2014 - 19:35 Der er 20 kommentarer og
1 løsning

opret cookie, så bruger bliver ved med at være logget ind

Hejsa.

Jeg har fået lavet mit login, så det virker. Nu vil jeg så gerne have at der oprettes en cookie, så en bruger bliver ved med at være logget ind på de sider jeg har oprettet. Jeg har læst mig til en smule om HttpSession og hvad der sker når der oprettes en cookie. Det er nu også fint nok, men jeg er lidt i tvivl om selve cookien skal have en servlet i sig selv, eller om den skal implementeres i servletten når bruger bliver succesfuldt logget ind? Jeg har prøvet at lave noget kode.. Er jeg helt forkert på den, eller på rette vej? Mvh Mads

package ExamplePackage;

import java.io.IOException;
import java.sql.Date;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/CookieUsageServlet")
public class CookieUsageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
   
    public CookieUsageServlet() {
        super();
     
    }

   
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = getCookie(request, response);
        printResponse(response, cookie);
    }
   
    private Cookie getCookie(HttpServletRequest request, HttpServletResponse response) {
        Cookie cookie = null;
        Cookie[] cookieArray = request.getCookies();
        if(cookieArray != null) {
            for(int x = 0; x < cookieArray.length; x++) {
                if(cookieArray[x].getName().equals("za_cookie")) cookie = cookieArray[x];
            }
        }
        if(cookie != null) {
            System.out.println("cookie retrieved");
        } else {
            int timeToExpireCookie = new Integer(getServletContext().getInitParameter("time-to-expire-cookie")).intValue();
            cookie = new Cookie("za_cookie", Long.toString(new Date(timeToExpireCookie).getTime()));
            cookie.setMaxAge(timeToExpireCookie);
            cookie.setPath(request.getContextPath()); // Stil til login??
            System.out.println("Cookie created...");
            response.addCookie(cookie);
        }
        return cookie;
    }
    private void printResponse(HttpServletResponse response, Cookie cookie) throws IOException {
        PrintWriter printWriter = response.getWriter();
        response.setContentType("text/html");
        printWriter.println("<html>");
        printWriter.println("<head><title>Cookie In JAVA servlet</title></head>");
        printWriter.println("<body>");
        printWriter.println("<cookie name: " + cookie.getName() + "<br>");
        printWriter.println("<cookie value: " + cookie.getValue() + "<br>");
        printWriter.println("<time to expire cookie in seconds: " + cookie.getMaxAge() + "<br>");
        printWriter.println("</body>");
        printWriter.println("</html>");
       
       
    }

}
Avatar billede arne_v Ekspert
25. februar 2014 - 19:52 #1
Vil du have at brugeren logger ind og forbliver logget ind indtil brugeren lukker browseren eller session udloever?

Eller vil du have at brugeren er logget automatisk hver dag?
Avatar billede madseksperten Nybegynder
25. februar 2014 - 20:25 #2
ja det var nok lidt dårligt formuleret af mig. Jeg vil gerne have at brugeren forbliver logget indtil brugeren lukker browseren eller sessionen udløber.
Avatar billede arne_v Ekspert
25. februar 2014 - 20:43 #3
Saa skal du slet ikke selv goere noget for at faa en session cookie sat op.

Det vil foerste JSP side der vises goere helt automatisk.
Avatar billede arne_v Ekspert
25. februar 2014 - 20:44 #4
Hvis du vil fjerne den (logout) saa skal du bare kalde invalidate paa session.
Avatar billede arne_v Ekspert
25. februar 2014 - 20:46 #5
Saa session har du altid.

Men nu kommer det mere tricky.

Naeste skidt er jo at holde styr paa om bruger er logget ind eller ej.

Det kan du goere programmatisk. Som du vel er beyndt paa. Ved successfuld login gemmer du noget i session der siger at vedkommende er logget ind som bruger XXX.

Alternativet er at bede serveren om selv at holde styr paa det. Det kan jeg finde nogle links til hvis du er interesseret.
Avatar billede arne_v Ekspert
25. februar 2014 - 20:51 #6
For det programmatisk er her nogle kode snippets som ganske vist bruger Struts, men ideen maa vaere til at forstaa:


package test;

import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.struts.action.*;

public class LoginAction extends Action {
    public ActionForward execute(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response) throws IOException, ServletException {
        LoginForm lgifrm = (LoginForm)form;
        String username = lgifrm.getUsername();
        String password = lgifrm.getPassword();
        try {
            if(password.equals(StrutsUsers.getInstance().getPassword(username))) {
                request.getSession().setAttribute("user", lgifrm.getUsername());
                return mapping.findForward("login.ok");
            } else {
                ActionErrors errors = new ActionErrors();
                errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("username.password.not.valid"));
                saveErrors(request, errors);
                return mapping.findForward("login.failure");
            }
        } catch (ClassNotFoundException ex) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("database.error"));
            saveErrors(request, errors);
            return mapping.findForward("login.failure");
        } catch (SQLException ex) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("database.error"));
            saveErrors(request, errors);
            return mapping.findForward("login.failure");
        }
    }
}



package test;

import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.struts.action.*;

public class ListAction extends Action {
    public ActionForward execute(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response) throws IOException, ServletException {
        if(request.getSession().getAttribute("user") == null) {
            return mapping.findForward("not.logged.in");
        }
        try {
            request.setAttribute("all", StrutsUsers.getInstance().getAll());;
            return mapping.findForward("data.ok");
        } catch (ClassNotFoundException ex) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("database.error"));
            saveErrors(request, errors);
            return mapping.findForward("data.error");
        } catch (SQLException ex) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("database.error"));
            saveErrors(request, errors);
            return mapping.findForward("data.error");
        }
    }
}
Avatar billede madseksperten Nybegynder
27. februar 2014 - 12:23 #7
Tak for svaret Arne.

Okay jeg har siddet og leget lidt med det første du skriver. Det vil sige når brugeren har indtastet de rigtige informationer ind kommer denne frem til siden:

index.jsp:

<form action="LoginServlet">

            Please enter your username        
            <input type="text" name="un"/><br>       
       
            Please enter your password
            <input type="text" name="pw"/>
           
            <input type="submit" value="submit">           
</form>

Fra login form kommer man på denne side:

userLogged.jsp:
<body>
    You put in the correct information
    <%
            String name = request.getParameter( "un" );
            session.setAttribute( "theName", name );
    %>
    Hello<%= session.getAttribute("theName") %>
        <%
            String redirectURL = "PersonalSite.jsp";
            response.sendRedirect(redirectURL);
        %>
</body>


Her redirectes man så hen til siden. Det er denne side jeg skal arbejde med logout funktionen og det kode du har lavet der.

PersonalSite.jsp

Når jeg indtaster brugerid og kode ind kommer jeg dog frem til siden, hvor der står :

You put in the correct information Hellonull. Det vil site jet får ikke kit burger id frem, så der står Hello B85417. Det lykkedes et par gange, men så stopper det med at virke igen. Jeg prøvede at kalde med String name = request.getParameter( "username" ); istedet for. Men hvis man gør dette kunne jeg forestille mig der skulle være en eller anden action på min html form?
Avatar billede madseksperten Nybegynder
27. februar 2014 - 13:00 #8
Servletten der håndterer mit login ser sådan ud:

package ExamplePackage;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, java.io.IOException {

        try {       

            UserBean user = new UserBean();
            user.setUserName(request.getParameter("un"));
            user.setPassword(request.getParameter("pw"));

            user = UserDAO.login(user);
                 
        if (user.isValid()) {
           
          HttpSession session = request.getSession(true);       
          session.setAttribute("currentSessionUser",user);
          response.sendRedirect("userLogged.jsp"); //logged-in page             
        }
           
        else
          response.sendRedirect("invalidLogin.jsp"); //error page
        }
       
       
            catch (Throwable theException) {
                System.out.println(theException);
            }
      }
    }

Her har jeg jo faktisk en session, men hvordan kan jeg kalde den, så der fx kommer til at stå ved succesfuldt login:

Hej Mads. Du er nu logget ind?
Avatar billede madseksperten Nybegynder
27. februar 2014 - 13:30 #9
Nej jeg har lige prøvet at tænke mig om. Min
Min login servlet håndterer sessionen:

package ExamplePackage;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, java.io.IOException {

        try {       

            UserBean user = new UserBean();
            user.setUserName(request.getParameter("un"));
            user.setPassword(request.getParameter("pw"));

            user = UserDAO.login(user);
                 
        if (user.isValid()) {
           
          HttpSession session = request.getSession(true);       
          session.setAttribute("currentSessionUser",user);
          response.sendRedirect("userLogged.jsp"); //logged-in page             
        }
           
        else
          response.sendRedirect("invalidLogin.jsp"); //error page
        }
       
       
            catch (Throwable theException) {
                System.out.println(theException);
            }
      }
    }


Her er der en variabel som hedder "user", og som håndterer sessionen? Den attribute burde man jo kunne kalde ved PersonalSite ved:

<body>
          <%@ page import="ExamplePackage.LoginServlet" %>
    Hello <%= session.getAttribute( "user" ) %>
</body>

Eller er det mig der er helt galt på den? Det er det jo nok, siden jeg stadigvæk får Hello Null
Avatar billede arne_v Ekspert
27. februar 2014 - 17:06 #10
session.setAttribute("currentSessionUser",user);
...
session.getAttribute( "user" )

ser ikke samarbejdsvillige ud!

:-)

attribut navnet skal vaere det samme.
Avatar billede madseksperten Nybegynder
27. februar 2014 - 18:30 #11
hehe ja god ide må man sige... :-/ Jeg tænker blot umiddelbart at

Syntaksen for setAttribute er:

setAttribute("String str", Object obj);
hvilket i mit tilfælde er:

session.setAttribute("currentSessionUser", user);

Syntaksen for getAttribute er:

getAttribute("String str");

hvilket i mit tilfælde er:

Hello <%= session.getAttribute("currentSessionUser") %>

Det burde vel at være korrekt?
Avatar billede arne_v Ekspert
27. februar 2014 - 18:43 #12
det ser rigtigt ud
Avatar billede madseksperten Nybegynder
27. februar 2014 - 18:47 #13
Det eneste jeg får er beskeden:

Hello ExamplePackage.UserBean@4fff395a :-/
Avatar billede madseksperten Nybegynder
27. februar 2014 - 18:53 #14
Altså min side går fra:

LoginPage.jsp -> userLogged.jsp -> PersonalSite.jsp

userLogged: Får man beskeden: "you put in the correct information" og kan trykke videre til
PersonalSite.jsp.

Det er på userLogged.jsp jeg prøver at kalde navnet:

<body>
    You put in the correct information
   
    Hello <% session.getAttribute("currentSessionUser"); %>
   
    <a href="PersonalSite.jsp">Videre</a>
</body>
Avatar billede arne_v Ekspert
27. februar 2014 - 18:59 #15
Ah. Saa user er en UserBean og UserBean har ikke en toString metode.

:-)
Avatar billede arne_v Ekspert
27. februar 2014 - 19:00 #16
mulige loesninger:

1) gem kun brugernavn ikke bean

2) giv UserBean en toString metode

3)  Hello <%= ((UserBean)session.getAttribute("currentSessionUser")).getUser() %>
Avatar billede arne_v Ekspert
27. februar 2014 - 20:58 #17
Og du skal nok snart i gang med at kigge paa EL.

<%= session.getAttribute("currentSessionUser") %>

kan skrives som:

${currentSessionUser}

<%= ((UserBean)session.getAttribute("currentSessionUser")).getUser() %>

kan skrives som:

${currentSessionUser.user}
Avatar billede madseksperten Nybegynder
28. februar 2014 - 09:10 #18
Super.. Mange tak for det igen Arne. Jeg løste det ved din mulighed nr.3:

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<%@page import="ExamplePackage.UserBean" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Insert title here</title>
</head>
<body>
    You put in the correct information
    <br><br>
    Hello <%= ((UserBean)session.getAttribute("currentSessionUser")).getUsername() %>
   
    <br><br>
    <a href="PersonalSite.jsp">Videre</a>
</body>
</html>

Nu har jeg jo så det iorden. Jeg vil bruge dagen på at se om jeg kan få det med cookies til at virke. Jeg tænker nu har jeg i hvert fald fået velkomst beskeden til at virke, men nu skal jeg have lavet at brugeren er logget ind på siderne, og kan logge ud igen. Jeg vil kigge på noget af det kode du postede tidligere. Jeg lukker spørgsmålet her, så smider du et svar? :-)

Mvh Mads
Avatar billede arne_v Ekspert
28. februar 2014 - 20:16 #19
svar
Avatar billede arne_v Ekspert
28. februar 2014 - 20:18 #20
taglibs, EL og JSTL vil maaske kunne goere nogle ting nemmere.

Og med container managed security ville du slet ikke skulle lave noget af alt dette manuelt.
Avatar billede madseksperten Nybegynder
01. marts 2014 - 14:17 #21
ok Mange tak for det Arne
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester