All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.jstuff.integration.servlet.ServletUtils Maven / Gradle / Ivy

/*
 * Copyright 2010-2022 by Sebastian Thomschke and contributors.
 * SPDX-License-Identifier: EPL-2.0
 */
package net.sf.jstuff.integration.servlet;

import java.io.IOException;
import java.security.cert.X509Certificate;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jdt.annotation.Nullable;

import net.sf.jstuff.core.validation.Args;

/**
 * @author Sebastian Thomschke
 */
public abstract class ServletUtils {

   @SuppressWarnings("unchecked")
   public static  T getAttribute(final ServletRequest request, final String name) {
      return (T) request.getAttribute(name);
   }

   public static @Nullable X509Certificate getClientCertificate(final ServletRequest request) {
      Args.notNull("request", request);

      final X509Certificate[] certChain = getAttribute(request, "javax.servlet.request.X509Certificate");
      if (certChain == null || certChain.length == 0)
         return null;
      return certChain[0];
   }

   public static String getContextURL(final HttpServletRequest request) {
      Args.notNull("request", request);

      final String scheme = request.getScheme();
      final int port = request.getServerPort();
      final String urlPath = request.getContextPath();

      final var url = new StringBuilder();
      url.append(scheme); // http, https
      url.append("://");
      url.append(request.getServerName());
      if (port != 80 && "http".equals(scheme) //
         || port != 443 && "https".equals(scheme) //
      ) {
         url.append(':');
         url.append(request.getServerPort());
      }
      url.append(urlPath);
      return url.toString();
   }

   public static void requestBasicAuth(final HttpServletResponse response, final String realm) throws IOException {
      response.setHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\"");
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
   }

   public static void setNoCachingHeaders(final HttpServletResponse response) {
      Args.notNull("response", response);

      //http://www.onjava.com/pub/a/onjava/excerpt/jebp_3/index2.html
      // Set to expire far in the past.
      response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
      // Set standard HTTP/1.1 no-cache headers.
      response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
      // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
      response.addHeader("Cache-Control", "post-check=0, pre-check=0");
      // Set standard HTTP/1.0 no-cache header.
      response.setHeader("Pragma", "no-cache");
   }

   public static void setRecommendedSecurityHeaders(final HttpServletResponse response, final boolean alwaysHTTPS) {
      Args.notNull("response", response);

      // https://www.globaldots.com/8-http-security-headers-best-practices/
      response.setHeader("X-XSS-Protection", "1");
      response.setHeader("X-Content-Type-Options", "nosniff");
      response.setHeader("X-Frame-Options", "SAMEORIGIN");
      if (alwaysHTTPS) {
         response.setHeader("Strict-Transport-Security", "max-age=63072000; includeSubDomains");
      }
      response.setHeader("Referrer-Policy", "no-referrer");
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy