[STRUTS] Redirect=true

Pagina: 1
Acties:

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Ik zit hier met een paar collega's te discussieren over het gebruik van het attribuut redirect="true" in een STRUTS forward tag.

Een exacte, goed bruikbare omschrijving kunnen we niet vinden op het internet, alleen maar dingen als deze:
code:
1
redirect: True or false (default). Should the ActionServlet redirect to the resource instead of forward?

Hier hebben we niet echt iets aan. Het boek voor Certified Web Component beweert dat een forward 100% transparant is voor de client en een redirect niet. (tenminste niet voor de browser)

De reden dat ik deze vraag stel is dat die collega een request parameter niet kan opvragen terwijl deze wel gezet is. Dit lijkt door de redirect te komen, maar uitzetten haalt de complete werking van die use case overhoop.

Iemand een oplossing hiervoor? Sowieso, kan iemand precies uitleggen hoe die redirect werkt vanuit ontwikkelaarsperspectief?

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Redirect is een response naar de browser met daarin een melding (uit de http status code 300 serie) om een andere URL op te vragen. Een Redirect komt dus feitelijk neer op een compleet nieuwe request vanuit de browser. Zodoende ben je dus je request parameters 'kwijt'.

Een forward is het doorsturen van een request aan de server kant, je ziet dus ook niets veranderen aan de url in de browser (itt een redirect). Zodoende heb je bij een forward wel beschikking over request parameters, je bent immers nog bezig dezelfde request af e handelen.

Verwijderd

JKVA schreef op woensdag 17 mei 2006 @ 08:44:
Ik zit hier met een paar collega's te discussieren over het gebruik van het attribuut redirect="true" in een STRUTS forward tag.

Een exacte, goed bruikbare omschrijving kunnen we niet vinden op het internet, alleen maar dingen als deze:
code:
1
redirect: True or false (default). Should the ActionServlet redirect to the resource instead of forward?

Hier hebben we niet echt iets aan. Het boek voor Certified Web Component beweert dat een forward 100% transparant is voor de client en een redirect niet. (tenminste niet voor de browser)
http://www.theserverside....e.tss?l=RedirectAfterPost
(PRG => PostRedirectGet)
PRG pattern can be rephrased like this:

Never show pages in response to POST
Always load pages using GET
Navigate from POST to GET using REDIRECT
De reden dat ik deze vraag stel is dat die collega een request parameter niet kan opvragen terwijl deze wel gezet is. Dit lijkt door de redirect te komen, maar uitzetten haalt de complete werking van die use case overhoop.

Iemand een oplossing hiervoor? Sowieso, kan iemand precies uitleggen hoe die redirect werkt vanuit ontwikkelaarsperspectief?
Een redirect passeert via de client (webbrowser) terwijl een forward intern afgehandeld wordt.
=> een redirect krijgt een nieuwe servletrequest
een forward krijgt dezelfde servletrequest.

dus als je redirect moet je alle nodige parameters doorgeven naar de redirect URL.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Idd, dat was ook onze conclusie. Toevallig een idee waarom iemand zou redirecten? Buiten het geval waarin je naar een compleet ander stuk applicatie springt?

Bijvoorbeeld in een hoofdmenu kan ik me voorstellen dat je die redirect gebruikt, maar middenin een usecase flow... :?

edit:

Te traag getyped. :)

[ Voor 7% gewijzigd door JKVA op 17-05-2006 09:47 ]

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Vanwege de enige echte reden natuurlijk:
- Wanneer een pagina verplaatst is naar een andere locatie (tijdelijk, permanent)

En eigelijk is het springen naar een ander stuk van de applicatie een redelijk fout voorbeeld. Dat doet de gebruiker wel door op de juiste link de klikken, daar hoef je niet http voor te misbruiken.

[ Voor 46% gewijzigd door Verwijderd op 17-05-2006 09:51 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Hmm, ok. Maar ik doelde met dat menu vooral op het feit dat je tussen dergelijke requests vaak geen parameters wilt bewaren. Binnen een flow wel.

Dat zou dus willen zeggen dat je op een bepaalde manier die parameters weer in de request wil stoppen. Maar dat gaat niet, omdat je de url die aangeroepen wordt, niet verder kan aanpassen. Toch???

Fat Pizza's pizza, they are big and they are cheezy


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:22

Janoz

Moderator Devschuur®

!litemod

Een redirect=true gebruik ik altijd na 'een actie zonder pagina'. Als ik een wijzig formulier submit of een delete uitvoer wil ik altijd weer het overzichts scherm tonen. Wanneer je hier een serverside redirect voor uitvoert blijft er in de adresbalk blaatEditAction of blaatDeleteAction staan. Wanneer de gebruiker dan op F5 drukt loopt het mis.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

JKVA schreef op woensdag 17 mei 2006 @ 09:44:
Idd, dat was ook onze conclusie. Toevallig een idee waarom iemand zou redirecten? Buiten het geval waarin je naar een compleet ander stuk applicatie springt?

Bijvoorbeeld in een hoofdmenu kan ik me voorstellen dat je die redirect gebruikt, maar middenin een usecase flow... :?
In een specifieke use case flow lijkt het me niet handig, maar wat begrijp je daar precies onder?

Een redirect is belangrijk als er een specifieke operatie gebeurd (bvb database operatie), die je niet herhaald wil zien worden door de gebruiker (door bvb 'refresh'). Hier zijn nog andere technieken voor (tokens), maar deze verhogen de complexiteit dan ook weer.
edit:
^ with stupid, hier vlak boven ;)

[ Voor 5% gewijzigd door -FoX- op 17-05-2006 10:38 ]


Verwijderd

Niet mee eens, ik vind dat toch wel behoorlijk http misbruiken. Het argument om dat het voorkomt dat een actie herhaalt wordt vind ik niet opgaan. Een client kan immers simpelweg op de back knop drukken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:22

Janoz

Moderator Devschuur®

!litemod

Nee, want door op de back knop te drukken kom je in het edit scherm terecht.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • momania
  • Registratie: Mei 2000
  • Laatst online: 08:47

momania

iPhone 30! Bam!

Verwijderd schreef op woensdag 17 mei 2006 @ 10:51:
Niet mee eens, ik vind dat toch wel behoorlijk http misbruiken. Het argument om dat het voorkomt dat een actie herhaalt wordt vind ik niet opgaan. Een client kan immers simpelweg op de back knop drukken.
Moah, je request 'eindigd' natuurlijk als je iets opslaat, delete, etc. Dat is de actie die een gebruiker ook doet. Daarna bepaald de server weer wat er getoond word (een overview, search scherm, whatever) en daar gebruik je dan een nieuwe request voor, ofwel de redirect.

Beste oplossing om te voorkomen dat pagina's dubbele ge-submit worden blijft natuurlijk het implementeren van de tokens :)

Neem je whisky mee, is het te weinig... *zucht*


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Maar heeft iemand een idee hoe je parameters in de 'nieuwe' request kunt stoppen? Dus je form submitten, hij wordt geredirect en de url waarnaartoe geredirect wordt, daar stop je de parameters in. Is dit in code mogelijk?

Ik doel dus niet op

bladiebla.do?cmd=show,

maar op:

bladiebla.do?uniqueid=HierEenParameterUitBijvoorbeeldJeForm

Fat Pizza's pizza, they are big and they are cheezy


  • momania
  • Registratie: Mei 2000
  • Laatst online: 08:47

momania

iPhone 30! Bam!

Forward zoeken, kopie van maken en path aanpassen :?
Java:
1
2
3
ActionForward forward = mapping.findForward("success");
ActionForward newActionForward = new ActionForward(forward);
newActionForward.setPath(forward.getPath() + "?uniqueid=" + rareId);

Neem je whisky mee, is het te weinig... *zucht*

Pagina: 1