Java Web Services via REST bereitstellen
ulrich@undisclosed
2020-05-02 e72f145db006c09ceab583f091e3f750189077bc
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 Transit - Remote procedure calls made simple
 Copyright (c) 2012  Ulrich Hilger
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Affero General Public License for more details.
 
 You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.uhilger.transit.web;
 
import java.security.Principal;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
 
/**
 * Basisklasse mit gemeinsamem Code fuer die TransitServlets
 * 
 * @author Copyright (c) Ulrich Hilger, http://uhilger.de
 * @author Published under the terms and conditions of the
 * <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero
 * General Public License</a>
 *
 * @version 1, September 16, 2012
 */
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;
  }
    
}