[JSP] Redirect naar referrer geen refresh

Pagina: 1
Acties:

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 08:16
Ben nu een paar dagen met dit JSP avontuur bezig, maar loop nu tegen het volgende probleem aan.

Ik heb 2 pagina's, een pagina met usergegevens, downloads en een knop (in een form) om de download aan te bieden en usergegevens aan te passen.

Dat zit zo in elkaar

HTML:
1
2
3
4
<form name='frm' action='download.jsp' method='post' onsubmit="return confirm('Wil je verder gaan met deze actie?\nNa akkoord worden de credits van je account afgeschreven');">
                                            <input name='code' type='hidden' value='<%=res.getString("file_code")%>'>
                                            <input type="submit" value="Download">&nbsp;(<%=Math.round(res.getDouble("file_sizeBytes") / 1024 / 1024)%> MB)
                                        </form>


In download.jsp gebeurt het volgende

HTML:
1
2
// Hier heel veel onzin dat allemaal goed werkt, update usergegevens in de database enzo
response.sendRedirect(request.getHeader("Referer"));

Hij gaat dan weer goed terug naar de pagina en de download wordt aangeboden. Alleen de usergegevens zoals deze op de pagina staan worden niet aangepast, ook als ik de actie meerdere malen uitvoer blijft de oude waarde staan.

In eerste instantie dacht ik dat hij eerder de pagina weergeeft dan de database klaar is, maar een Thread.sleep() sloot dit uit.
Als ik in de database zelf het eea aanpas en dan de actie uitvoer gebeurt er ook niets op de pagina. Het enige wat wel werkt is een refresh van de pagina zelf (F5). Ik heb dit in IE en FireFox geprobeerd en beide browsers doen hetzelfde.

Mag ik er van uitgaan dat bij een redirect gewoon de pagina opnieuw ingeladen wordt, of heeft dit hetzelfde effect als de "Back" knop in je browser?

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 02:56

Nick_S

++?????++ Out of Cheese Error

Blijkbaar mag je daar niet van uit gaan. ;) Je zal de user info pagina moeten renderen met een aantal cache parameters.

code:
1
2
3
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server


Dit moet dus al de eerste keer gebeuren, en niet nadat je je gegevens hebt aangepast.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 08:16
Nick_S schreef op donderdag 26 februari 2009 @ 15:08:
Blijkbaar mag je daar niet van uit gaan. ;) Je zal de user info pagina moeten renderen met een aantal cache parameters.

code:
1
2
3
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server


Dit moet dus al de eerste keer gebeuren, en niet nadat je je gegevens hebt aangepast.
Bedankt voor je reactie... ik had de issue wat links laten liggen en verder was het er wat bij ingeschoten, niet zo netjes van me om zo laat pas respons te geven maargoed.

Ik heb geprobeerd bovenstaande erin te zetten, maar geeft geen resultaat. Ik neem aan dat dit als eerste wordt aangeroepen op de pagina vóórdat de database updates worden uitgevoerd?

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 02:56

Nick_S

++?????++ Out of Cheese Error

Teeno schreef op woensdag 25 maart 2009 @ 17:52:
[...]
Ik heb geprobeerd bovenstaande erin te zetten, maar geeft geen resultaat. Ik neem aan dat dit als eerste wordt aangeroepen op de pagina vóórdat de database updates worden uitgevoerd?
Heb je het op de referer pagina erin gezet of in download.jsp?

Het gaat erom dat browsers, proxies, en misschien nog andere pagina's cachen. Wil je dit niet, zul je op die pagina's de juiste cache headers moeten toevoegen.

Het enige wat je doet met een redirect is tegen de browser zeggen naar welke pagina deze moet gaan. Of je browser deze opnieuw ophaalt of uit een cache haalt, heb je in je redirect niks over te zeggen. Dat wordt per pagina bekeken.

Eventueel database verkeer heeft hier dus ook niets mee te maken.

[ Voor 4% gewijzigd door Nick_S op 25-03-2009 18:04 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 08:16
Nick_S schreef op woensdag 25 maart 2009 @ 18:03:
[...]


Heb je het op de referer pagina erin gezet of in download.jsp?

Het gaat erom dat browsers, proxies, en misschien nog andere pagina's cachen. Wil je dit niet, zul je op die pagina's de juiste cache headers moeten toevoegen.

Het enige wat je doet met een redirect is tegen de browser zeggen naar welke pagina deze moet gaan. Of je browser deze opnieuw ophaalt of uit een cache haalt, heb je in je redirect niks over te zeggen. Dat wordt per pagina bekeken.

Eventueel database verkeer heeft hier dus ook niets mee te maken.
Ik begrijp het. Heb het op zowel de referrer als de download.jsp geprobeerd, in beide gevallen geen positief resultaat.

Acties:
  • 0 Henk 'm!

Verwijderd

Teeno schreef op donderdag 26 februari 2009 @ 15:05:
...
Ik heb 2 pagina's, een pagina met usergegevens, downloads en een knop (in een form) om de download aan te bieden en usergegevens aan te passen.
...
In je form zie ik alleen maar de download code. Moet je de gebruikers gegevens niet ook in dit form zetten als je ze wilt gebruiken in download.jsp?

Acties:
  • 0 Henk 'm!

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 08:16
Verwijderd schreef op donderdag 26 maart 2009 @ 09:24:
[...]


In je form zie ik alleen maar de download code. Moet je de gebruikers gegevens niet ook in dit form zetten als je ze wilt gebruiken in download.jsp?
Ik sla bij het inloggen het userID op in de sessie, aan de hand hiervan kan de downloadpagina de gebruikersgegevens updaten. Dit werkt ook allemaal goed, alleen krijg ik het dus niet voor elkaar om bij een redirect naar de referrer de referral pagina automatisch te refreshen, hiervoor moet ik eerst op F5 drukken en dat is niet de bedoeling.

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik snap geen zak van je probleem, maar wat mij wel duidelijk is dat je de ResultSet al zo vér in je JSP doordrukt dat ik me niet aan de indruk kan onttrekken dat de algehele "design" gewoonweg fout is. Ik durf te wedden dat je de JDBC resources niet netjes commit/closed na het gebruik, waardoor de resources weglekken en de updates niet direct in de DB worden doorgevoerd.

JSP gebruik je om data te presenteren, niet om met de database te babbelen. Daar gebruik je een onafhankelijke Java class voor. Kijk maar eens rond met de sleutelwoord "DAO pattern". Tenslotte gebruik je een servlet om met deze DAO class te babbelen, data uit te wisselen en in de gewenste scope te zetten en tenslotte de request te doorsturen naar de JSP welke op haar beurt de data netjes presenteert. Rauwe Java code in een JSP bestand neerschrijven is simpelweg vragen om problemen. Vroeg of laat.

Daarnaast, jouw idee van het hele download.jsp is mij vaag. Het klinkt alsof je tegelijkertijd een download en een redirect wil aanbieden via éénzelfde request. Dit is onmogelijk. Je kunt hooguit 1 respons sturen per request, niet 2. Ook leunt jouw code op de "referer" header, een optionele HTTP header waar de client de volledige controle over heeft. De client kan bij wijze van de referrer spoofen, hacken of zelfs helemaal weglaten of een code-injectie invoegen. Gebruik de referer alleen voor statistieken en echt niet meer dan dat.

edit:
Bij nader inzien, je wilt in feite de pagina opnieuw refreshen na de download? Indien ja, kijk maar eens in de logs van je appserver. Je vindt er gegarandeerd een IllegalStateException in met een bericht in de trant van "response already committed".

[ Voor 7% gewijzigd door BalusC op 26-03-2009 13:38 ]


Acties:
  • 0 Henk 'm!

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 08:16
BalusC schreef op donderdag 26 maart 2009 @ 13:23:
Ik snap geen zak van je probleem, maar wat mij wel duidelijk is dat je de ResultSet al zo vér in je JSP doordrukt dat ik me niet aan de indruk kan onttrekken dat de algehele "design" gewoonweg fout is. Ik durf te wedden dat je de JDBC resources niet netjes commit/closed na het gebruik, waardoor de resources weglekken en de updates niet direct in de DB worden doorgevoerd.

JSP gebruik je om data te presenteren, niet om met de database te babbelen. Daar gebruik je een onafhankelijke Java class voor. Kijk maar eens rond met de sleutelwoord "DAO pattern". Tenslotte gebruik je een servlet om met deze DAO class te babbelen, data uit te wisselen en in de gewenste scope te zetten en tenslotte de request te doorsturen naar de JSP welke op haar beurt de data netjes presenteert. Rauwe Java code in een JSP bestand neerschrijven is simpelweg vragen om problemen. Vroeg of laat.

Daarnaast, jouw idee van het hele download.jsp is mij vaag. Het klinkt alsof je tegelijkertijd een download en een redirect wil aanbieden via éénzelfde request. Dit is onmogelijk. Je kunt hooguit 1 respons sturen per request, niet 2. Ook leunt jouw code op de "referer" header, een optionele HTTP header waar de client de volledige controle over heeft. De client kan bij wijze van de referrer spoofen, hacken of zelfs helemaal weglaten of een code-injectie invoegen. Gebruik de referer alleen voor statistieken en echt niet meer dan dat.

edit:
Bij nader inzien, je wilt in feite de pagina opnieuw refreshen na de download? Indien ja, kijk maar eens in de logs van je appserver. Je vindt er gegarandeerd een IllegalStateException in met een bericht in de trant van "response already committed".
Bedankt voor je feedback, het meeste van bovenstaande klopt wel dus daar ga ik eens naar kijken.
Pagina: 1