Ich möchte eine Erinnerungsfunktion in mein sehr einfaches Servlet-basiertes System implementieren. Kein Frühling, kein Shiro, nichts. Ich habe große Mühe, es zum Laufen zu bringen. Auf dem Papier scheint es ziemlich einfach zu sein. Als Einstieg habe ich den folgenden Thread verwendet. Sehr schöner Remember Me-Thread
Soweit ich es verstanden habe, bot der oben verlinkte Thread drei Lösungen. 2 von BalusC und die dritte von (Ilyua) Basin am Ende des Threads.
Mein aktueller Versuch besteht darin, Lösung 2 von BalusC für Java 6/7 zu implementieren. Da ich die anderen beiden nicht zum Laufen bringen konnte. Hier stoße ich auf zwei Probleme. Ich werde jedoch nur ein Problem erwähnen, damit meine Frage nicht geschlossen wird. Der Filter scheint während des Anmeldevorgangs dreimal aufgerufen zu werden. Wenn meine index.jsp-Seite eine geschützte Ressource /jsp/startup.jsp anfordert, wird der Filter aufgerufen, wobei die Sitzung null ist und alles in Ordnung ist. Während dieses Aufrufs überprüfe ich das Cookie und den DB-Eintrag, und falls beide fehlen, leite ich den Benutzer zur Seite login.jsp weiter, um seine Anmeldeinformationen zum ersten Mal bereitzustellen. Der Benutzer gibt die Anmeldeinformationen an und sendet das Formular. Der Filter wird ein zweites Mal aufgerufen. Da ich im Filter sehe, dass wir von login.jsp kommen, leite ich den Aufruf an das Servlet weiter, das die Anmeldeseite verarbeitet. Dieses Servlet hat jetzt eine Sitzung, die nicht null ist. Es erstellt also ein Cookie, fügt eine Zeile für diesen Benutzer mit einer eindeutigen Cookie-ID in die Datenbank ein und fügt das Benutzerobjekt in die Sitzung ein. Am Ende des Servlets leite ich den Benutzer zur Seite „startup.jsp“ weiter, die er zunächst angefordert hat. Dies löst erneut einen Aufruf des Filters aus, nun zum dritten Mal, und hier bricht alles zusammen. Bei diesem dritten Aufruf des Filters ist die Sitzung zu meinem großen Schock und Entsetzen wieder auf Null, was die gesamte Logik völlig durcheinander bringt.
Offensichtlich übersehe ich etwas (oder viele Dinge), da diese Funktionalität an vielen, vielen Stellen erfolgreich implementiert wurde. Ich würde gerne herausfinden, was mir fehlt.
public class MyServletFilter extends SecurityParentServlet implements Filter
{
protected static final Logger logger = Logger.getLogger(MyServletFilter.class);
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fchain)
throws IOException, ServletException
{
logger.debug("MyServletFilter was called");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String sUserName = request.getParameter("username");
if ((sUserName != null) && (sUserName.length() > 0))
{
// The user is logging in so we should not be here
fchain.doFilter(req, resp);
return;
}
// If the user is logged in and in the session then send them along
HttpSession session = request.getSession(false);
if ((session != null) && (session.getAttribute("user") != null))
{
fchain.doFilter(req, resp);
return;
}
else
{
// Try to auto log the user in. They must have a cookie,
// be in the DB and DB record must not be expired
String uuid = getCookieValue(request, COOKIE_NAME);
logger.debug("MyServletFilter cookie value = "+uuid);
RememberMeUser rmUser = null;
if (uuid != null)
{
rmUser = DBHandler.getRememberUser(uuid);
logger.debug("MyServletFilter rmUser from DB = "+rmUser);
if (rmUser != null) {
request.login(rmUser.getAccount(), rmUser.getPassword());
session.setAttribute("user", rmUser);
logger.debug("MyServletFilter adding the cookie");
addCookie(response, uuid); // Extends age.
logger.debug("User is "+request.getRemoteUser());
} else {
logger.debug("MyServletFilter deleting the cookie");
removeCookie(response);
}
}
if (rmUser == null) {
goToLogin(request, response);
} else {
fchain.doFilter(req, resp);
}
}
}
}
@WebServlet("/ProcessLogin")
public class ProcessLogin extends SecurityParentServlet
{
protected static final Logger logger = Logger.getLogger(ProcessLogin.class);
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String sUserName = request.getParameter("username");
String sPassword = request.getParameter("password");
String sRememberMe = request.getParameter("remember_me");
RememberMeUser rmUser = new RememberMeUser();
if (sRememberMe != null)
{
// 1.Generate the unique Id to store in the cookie
String uuid = UUID.randomUUID().toString();
rmUser.setUniqueId(uuid);
// 2. Add the cookie
addCookie(response, uuid);
// 3. Save the user credentials in the DB with cookie id as the index
if (DBHandler.isRememberUserInDB(sUserName))
DBHandler.updateRememberMeUser(sUserName, uuid, sPassword);
else
DBHandler.insertRememberMeUser(uuid, sUserName, sPassword);
}
else
{
// Delete cookie and table entry
removeCookie(response);
DBHandler.deleteRememberMeUser(sUserName);
}
// Last step Log the user in
try
{
request.login(sUserName, sPassword);
rmUser.setAccount(sUserName); // For now we wil leave th PW unset and fetch from the DB if needed
// logger.debug("User is "+request.getRemoteUser()); // Sadly this on;y works at the time login method is called any subsequent calls makes this value disappear, hence we store the user in the session
HttpSession session = request.getSession(false);
session.setAttribute("user", rmUser); // Login.
// if (jSecurityCheck(request, response, sUserName, sPassword))
forward(request, response, "index");
}
catch (Exception e)
{
logger.error("Exception trying to login "+sUserName, e);
// Logging the user in automatically failed so send them to the Login screen
goToLogin(request, response);
}
}
}
[url=viewtopic.php?t=30561]Ich möchte[/url] eine Erinnerungsfunktion in mein sehr einfaches Servlet-basiertes System implementieren. Kein Frühling, kein Shiro, nichts. Ich habe große Mühe, es zum Laufen zu bringen. Auf dem Papier scheint es ziemlich einfach zu sein. Als Einstieg habe ich den folgenden Thread verwendet. Sehr schöner Remember Me-Thread Soweit ich es verstanden habe, bot der oben verlinkte Thread drei Lösungen. 2 von BalusC und die dritte von (Ilyua) Basin am Ende des Threads. Mein aktueller Versuch besteht darin, Lösung 2 von BalusC für Java 6/7 zu implementieren. Da ich die anderen beiden nicht zum Laufen bringen konnte. Hier stoße ich auf zwei Probleme. :( Ich werde jedoch nur ein Problem erwähnen, damit meine Frage nicht geschlossen wird. :) Der Filter scheint während des Anmeldevorgangs dreimal aufgerufen zu werden. Wenn meine index.jsp-Seite eine geschützte Ressource /jsp/startup.jsp anfordert, wird der Filter aufgerufen, wobei die Sitzung null ist und alles in Ordnung ist. Während dieses Aufrufs überprüfe ich das Cookie und den DB-Eintrag, und falls beide fehlen, leite ich den Benutzer zur Seite login.jsp weiter, um seine Anmeldeinformationen zum ersten Mal bereitzustellen. Der Benutzer gibt die Anmeldeinformationen an und sendet das Formular. Der Filter wird ein zweites Mal aufgerufen. Da ich im Filter sehe, dass wir von login.jsp kommen, leite ich den Aufruf an das Servlet weiter, das die Anmeldeseite verarbeitet. Dieses Servlet hat jetzt eine Sitzung, die nicht null ist. Es erstellt also ein Cookie, fügt eine Zeile für diesen Benutzer mit einer eindeutigen Cookie-ID in die Datenbank ein und fügt das Benutzerobjekt in die Sitzung ein. Am Ende des Servlets leite ich den Benutzer zur Seite „startup.jsp“ weiter, die er zunächst angefordert hat. Dies löst erneut einen Aufruf des Filters aus, nun zum dritten Mal, und hier bricht alles zusammen. Bei diesem dritten Aufruf des Filters ist die Sitzung zu meinem großen Schock und Entsetzen wieder auf Null, was die gesamte Logik völlig durcheinander bringt. Offensichtlich übersehe ich etwas (oder viele Dinge), da diese Funktionalität an vielen, vielen Stellen erfolgreich implementiert wurde. Ich würde gerne herausfinden, was mir fehlt. [code]public class MyServletFilter extends SecurityParentServlet implements Filter { protected static final Logger logger = Logger.getLogger(MyServletFilter.class);
@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fchain) throws IOException, ServletException { logger.debug("MyServletFilter was called"); HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String sUserName = request.getParameter("username"); if ((sUserName != null) && (sUserName.length() > 0)) { // The user is logging in so we should not be here fchain.doFilter(req, resp); return; } // If the user is logged in and in the session then send them along HttpSession session = request.getSession(false); if ((session != null) && (session.getAttribute("user") != null)) { fchain.doFilter(req, resp); return; } else { // Try to auto log the user in. They must have a cookie, // be in the DB and DB record must not be expired String uuid = getCookieValue(request, COOKIE_NAME); logger.debug("MyServletFilter cookie value = "+uuid);
RememberMeUser rmUser = null; if (uuid != null) { rmUser = DBHandler.getRememberUser(uuid); logger.debug("MyServletFilter rmUser from DB = "+rmUser); if (rmUser != null) { request.login(rmUser.getAccount(), rmUser.getPassword()); session.setAttribute("user", rmUser); logger.debug("MyServletFilter adding the cookie"); addCookie(response, uuid); // Extends age. logger.debug("User is "+request.getRemoteUser()); } else { logger.debug("MyServletFilter deleting the cookie"); removeCookie(response); } } if (rmUser == null) { goToLogin(request, response); } else { fchain.doFilter(req, resp); } } } } [/code] [code]@WebServlet("/SecurityParentServlet") public class SecurityParentServlet extends HttpServlet { public static final String COOKIE_NAME = "rememberme"; public static final int COOKIE_AGE = 30 * 86400;
/*********************************************************************** * @param response * @param value ***********************************************************************/ public static void addCookie(HttpServletResponse response, String value) { Cookie cookie = new Cookie(COOKIE_NAME, value); cookie.setPath("/"); cookie.setMaxAge(COOKIE_AGE); response.addCookie(cookie); }
String PROP = "sun.net.http.allowRestrictedHeaders"; if (!"true".equals(System.getProperty(PROP))) { request.getServletContext().log("must set to true: " + PROP); } System.out.println(System.getProperty(PROP)); System.out.println(request.getHeader("Host")); System.out.println(request.getHeader("Cookie")); conn.setRequestProperty("Host", request.getHeader("Host"));
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", Integer.toString(postDataLength)); conn.setRequestProperty("charset", "utf-8"); conn.setRequestProperty("Cookie", request.getHeader("Cookie")); OutputStream wr = conn.getOutputStream(); try { wr.write(postData); } finally { wr.close(); } // Request sent wait for response int code = conn.getResponseCode(); String location = null; if (code == 301 || code == 302 || code == 303 || code == 307 || code == 308) { location = conn.getHeaderField("Location"); if (location != null) { // In case of redirect there's no way to detect login success or failure // The Location can be either the error page or the original page address. // In the latter case it may still serve the login page again. /* String newcook = conn.getHeaderField("Set-Cookie"); if (newcook != null) { // response.setHeader("Set-Cookie", newcook); CookieCutter cc = new CookieCutter(); cc.addCookieField(newcook); for (Cookie c : cc.getCookies()) { response.addCookie(c); } } */ response.sendRedirect(location); return true; } } else { // if getInputStream() succeeds, then http 200 or such // meaning login failure (Tomcat) conn.getInputStream().close(); return false; } throw new ServletException("Unexpected j_security_check response " + code + " Location: " + location); } finally { conn.disconnect(); } }
/*********************************************************************** * @param params * @return * @throws Exception ***********************************************************************/ private static String getDataString(HashMap params) throws Exception { StringBuilder result = new StringBuilder(); boolean first = true; for(HashMap.Entry entry : params.entrySet()){ if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } return result.toString(); }
/*********************************************************************** * @param request * @param name * @return ***********************************************************************/ public static String getCookieValue(HttpServletRequest request, String name) { String sValue = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (name.equals(cookie.getName())) { sValue = cookie.getValue(); } } } return sValue; }
if (sRememberMe != null) { // 1.Generate the unique Id to store in the cookie String uuid = UUID.randomUUID().toString(); rmUser.setUniqueId(uuid); // 2. Add the cookie addCookie(response, uuid); // 3. Save the user credentials in the DB with cookie id as the index if (DBHandler.isRememberUserInDB(sUserName)) DBHandler.updateRememberMeUser(sUserName, uuid, sPassword); else DBHandler.insertRememberMeUser(uuid, sUserName, sPassword); } else { // Delete cookie and table entry removeCookie(response); DBHandler.deleteRememberMeUser(sUserName); } // Last step Log the user in try { request.login(sUserName, sPassword); rmUser.setAccount(sUserName); // For now we wil leave th PW unset and fetch from the DB if needed // logger.debug("User is "+request.getRemoteUser()); // Sadly this on;y works at the time login method is called any subsequent calls makes this value disappear, hence we store the user in the session HttpSession session = request.getSession(false); session.setAttribute("user", rmUser); // Login. // if (jSecurityCheck(request, response, sUserName, sPassword)) forward(request, response, "index"); } catch (Exception e) { logger.error("Exception trying to login "+sUserName, e); // Logging the user in automatically failed so send them to the Login screen goToLogin(request, response); } }
Ich würde gerne eine Erinnerungsfunktion in meine sehr einfachen Servlet-basierten Systeme implementieren und habe große Mühe, sie zum Laufen zu bringen. Auf dem Papier scheint es ziemlich einfach zu...
Ich habe kürzlich die Installation von Tiki Wiki CMS Groupware auf meiner Website von Version 25 auf Version 27 aktualisiert. Außerdem habe ich die PHP-Version von 7.4 auf 8.3 aktualisiert. Jetzt...
Ich habe die PIP-Installation für Twilio gemacht und das Terminal hat den größten Teil der Installation durchgeführt, aber am Ende gab es mir im Installationsfehlercode:
ERROR: Could not install...
Ich versuche, eine Liste von Quadraten gleicher Zahlen aus einer vorhandenen Liste zu erstellen, aber mein Listenverständnis gibt auch einige seltsame Quadrate zurück. Hier ist ein minimales...
Ich versuche, Recaptcha zu verwenden, um die Authentizität meines Benutzers vor dem Absenden des Formulars zu überprüfen, aber ich habe das Problem, dass meine Seite nur aktualisiert wird, wenn auf...