# Jsp, doPost, url ermitteln



## schlumsch (27. Sep 2010)

Hallo,

kleines Problem(chen). Ich möchte in meinem Servlet in der Methode doPost die url ermitteln, aus welcher doPost aufgerufen wurde. Sprich ich brauche den namen meiner Jsp, damit ich am Ende der Verarbeitung aus doPost heraus wieder auf meine ursprüngliche jsp redirecten kann. Wo finde ich das im request?
Versucht habe ich schon

```
String xxx = req.getRequestURI();
		String x2 = req.getContextPath();
		String x3 = req.getRemoteAddr();
		String x4 = req.getRemoteHost();
```

thx & Gruß


----------



## MiDniGG (27. Sep 2010)

So spontan würde ich den Namen der JSP einfach als Parameter übergeben...
Was anderes fällt mir jetzt nicht ein.


----------



## JohannisderKaeufer (27. Sep 2010)

Ein kleines Beispiel

die Datei index.html im Webcontent Folder

```
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="hello">hello</a>
</body>
</html>
```

Ein einfaches Servlet das den Request Header wiedergibt.

```
package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

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

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

    void doService(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter writer = new PrintWriter(response.getOutputStream());
        writer.print("<html><body><ul>");
        Enumeration<String> en = request.getHeaderNames();

        while (en.hasMoreElements()) {
            String text = en.nextElement();
            writer.print("<li>" + text + ": " + request.getHeader(text)
                    + "</li>");
        }
        writer.print("</ul></body></html>");
        writer.flush();
        writer.close();
    }

}
```

Die passende web.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>TEST</display-name>
  <servlet>
  <servlet-name>helloworld</servlet-name>
  <servlet-class>test.HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>helloworld</servlet-name>
  <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>[/XML]

Nachdem aus der index.html (TEST/index.html) auf den hello-Link geklickt wird, welcher das Servlet ausgibt ergibt sich folgende Ausgabe.


```
* host: localhost:8080
    * user-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko
    * accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    * accept-language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    * accept-encoding: gzip,deflate
    * accept-charset: UTF-8,*
    * keep-alive: 115
    * connection: keep-alive
    * referer: http://localhost:8080/TEST/index.html
```

Siehe da der letzte Punkt ist die Adresse von der aus das Servlet aufgerufen wurde.
Der sogenannte referer. Diesen findet man genauergesagt mit request.getHeader("referer");.
Sofern er vom aufrufenden Browser mitgeschickt wird und von keiner Firewall entfernt wird. Oder die URL in den Browser eingetippt wird.

Das Header "beschnitten" werden ist halt so! Denn wen geht es an welchen Browser ich benutze oder welches Betriebssystem mit welchen eklatanten Sicherheitslücken.


----------



## maki (27. Sep 2010)

@JohannisderKaeufer

Das passt aber nicht mit dem MVC/Model 2 Konzept zusammen, da linkt man nie direkt auf die JSP sondern geht immer über ein Servlet (Controller), daher würde der Referer nur auf die Servlet URL zeigen


----------



## Cage Hunter (28. Sep 2010)

Viele Beispiele zeigen diese Thematik auf, indem sie das Servlet-Mapping einfach auf "alles" legen, sprich "*"
Wenn nun im Root nach "xyz.jsp" gefragt wird, steht dies auch in req.getRequestURI() drin und das Servlet kann entsprechend weiterleiten


----------



## Atze (28. Sep 2010)

maki hat gesagt.:


> @JohannisderKaeufer
> 
> Das passt aber nicht mit dem MVC/Model 2 Konzept zusammen, da linkt man nie direkt auf die JSP sondern geht immer über ein Servlet (Controller), daher würde der Referer nur auf die Servlet URL zeigen



das lässt sich doch im servlet sicher lesen und wieder reinschreiben, oder überschreibt das servlet das wieder?


----------



## maki (28. Sep 2010)

Atze hat gesagt.:


> das lässt sich doch im servlet sicher lesen und wieder reinschreiben, oder überschreibt das servlet das wieder?


Die Referer URL ist nix weiter als das was im Browser in der URL Leiste steht, wenn das itrgendetwas mit .JSP steht, nutzt man kein MVC/Model 2 
MiDniGG hatte schon die richtige Idee, obwohl ich nicht den Namen der JSP reinschreiben würde, sondern ein command Parameter anhand dessen dann entschieden wird wohin der Request geforwarded wird.


----------



## schlumsch (28. Sep 2010)

Okay, nochmal dumm nachgefragt, ist die "beste" Lösung die von MiDniGG vorgeschlagene?


----------



## Atze (28. Sep 2010)

maki hat gesagt.:


> Die Referer URL ist nix weiter als das was im Browser in der URL Leiste steht, wenn das itrgendetwas mit .JSP steht, nutzt man kein MVC/Model 2
> MiDniGG hatte schon die richtige Idee, obwohl ich nicht den Namen der JSP reinschreiben würde, sondern ein command Parameter anhand dessen dann entschieden wird wohin der Request geforwarded wird.



ja, wenn man zb über struts actions (.do) geforwarded wird sieht man da ja auch nix, das stimmt schon. aber man ist ja nicht gezwungen nach dem modell 2 zu designen, nichtmal simples mvc wird in vielen anwendungen eingehalten. habs ja nur erwähnt, weils möglich wäre!


----------



## schlumsch (29. Sep 2010)

Okay ich danke euch erstmal. Grüße


----------

