Java Web Services via REST bereitstellen
ulrich
2014-11-16 1da1cadfe51b9fc9970091e0d2ee6bedbcfd859b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package de.uhilger.transit.web;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.security.Principal;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 *
 * @author ulrich
 */
public abstract class AbstractServlet extends HttpServlet {
 
  public static final String MIME_JSON = "application/json";
  public static final String MIME_XML = "text/xml";
 
  public static final String KLASSEN_TRENNER = ";";
  
  private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"), 
      new String("\u00dc"), new String("\u00e4"), new String("\u00f6"), new String("\u00fc"), new String("\u00df")};
  
  /** Name, der als Benutzername verwendet wird, wenn kein Benutzer angemeldet ist */
  public static final String ANONYMER_NUTZER = "anonymous";
  
  protected String[] klassen;
  
  @Override
  public void init(ServletConfig servletConfig) throws ServletException{
    this.klassen = servletConfig.getInitParameter("klassen").split(KLASSEN_TRENNER);
    super.init(servletConfig);
  }
  
  /**
   * Den Namen des angemeldeten Benutzers ermitteln.
   * 
   * @param req  die Anfrage, deren Benutzer ermittelt werden soll
   * @return Name des Benutzers oder <code>anonymous</code>, wenn 
   * kein Benutzer angemeldet ist
   */
  protected String getUserName(HttpServletRequest req) {
    String userName = null;
      Principal p = req.getUserPrincipal();
        if(p != null) {
            userName = p.getName();
        }
        if(userName == null) {
            userName = ANONYMER_NUTZER;
        }
        return userName;
    }  
 
  public String escapeHtml(String text) {
    text = text.replace(specialChars[0], "&Auml;");
    text = text.replace(specialChars[1], "&Ouml;");
    text = text.replace(specialChars[2], "&Uuml;");
    text = text.replace(specialChars[3], "&auml;");
    text = text.replace(specialChars[4], "&ouml;");
    text = text.replace(specialChars[5], "&uuml;");
    text = text.replace(specialChars[6], "&szlig;");
    return text;
  }
  
  /**
   * Hier wird geprueft, ob der Name einer Klasse der Liste der erlaubten 
   * Klassen bzw. Packages entspricht. Im Deployment Descriptor wird ein 
   * Ausdruck wie z.B. 
   * 
   * de.uhilger.test.web;de.uhilger.test.api;de.uhilger.test.db.KlassenName
   * 
   * erwartet. Diese Methode spaltet diesen Ausdruck an den ';' auf und prueft 
   * fuer jeden Ausdruck, ob der KlassenName mit diesem Ausdruck beginnt. 
   * Beginnt der Klassenname mit einem der Ausdruecke, wird der Zugriff erlaubt
   * 
   * @param klassenName  Name der Klasse, fuer die der Zugriff geprueft 
   * werden soll
   * @return true, wenn die Klasse laut dem Eintrag im Deployment Desccriptor 
   * aufgerufen werden darf, false wenn nicht
   */
  protected boolean istErlaubt(String klassenName) {
      boolean erlaubt = false;
      for(int i = 0; i < klassen.length && !erlaubt; i++) {
          erlaubt = klassenName.startsWith(klassen[i]);
      }
      return erlaubt;
  }
    
}