Implemented an interceptor, that forbiddes access according to a header
[demos/spring-boot] / src / main / java / de / juplo / demo / RequestTypeInterceptor.java
1 package de.juplo.demo;
2
3 import jakarta.servlet.http.HttpServletRequest;
4 import jakarta.servlet.http.HttpServletResponse;
5 import lombok.extern.slf4j.Slf4j;
6 import org.springframework.http.HttpStatus;
7 import org.springframework.stereotype.Component;
8 import org.springframework.web.method.HandlerMethod;
9 import org.springframework.web.servlet.HandlerInterceptor;
10
11 import java.io.IOException;
12
13
14 @Component
15 @Slf4j
16 public class RequestTypeInterceptor implements HandlerInterceptor
17 {
18   public final static String REQUEST_TYPE = "X-Request-Type";
19
20   public enum RequestType { HUMAN, MACHINE };
21
22
23   @Override
24   public boolean preHandle(
25       HttpServletRequest request,
26       HttpServletResponse response,
27       Object handler) throws IOException
28   {
29     //  Only instances of HandlerMethod are intercepted for the type of the request
30     if (!(handler instanceof HandlerMethod))
31     {
32       log.trace("Ignoring handler of type {}", handler);
33       return true;
34     }
35
36     String requestTypeHeader = request.getHeader(REQUEST_TYPE);
37     if (requestTypeHeader == null)
38     {
39       sendBadRequest(response, "Ignoring request without header");
40       return false;
41     }
42
43     try
44     {
45       RequestType requestType = RequestType.valueOf(requestTypeHeader.toUpperCase());
46
47       if (requestType == RequestType.MACHINE)
48       {
49         log.debug("Accepting machine-request for {}", handler);
50         return true;
51       }
52
53       if (((HandlerMethod)handler).getMethod().getAnnotation(RequestableByHumans.class) != null)
54       {
55         log.info("Accepting human request for {}", handler);
56         return true;
57       }
58       else
59       {
60         sendForbidden(response, "Human requests are not allowed for " + handler);
61         return false;
62       }
63     }
64     catch (IllegalArgumentException e)
65     {
66       log.warn("Invalid RequestType: {}", e.toString());
67     }
68
69     sendBadRequest(response, requestTypeHeader);
70     return false;
71   }
72
73   void sendForbidden(
74       HttpServletResponse response,
75       String message) throws IOException
76   {
77     log.warn("Forbidden: {}", message);
78     response.sendError(HttpStatus.FORBIDDEN.value(), message);
79   }
80
81   void sendBadRequest(
82       HttpServletResponse response,
83       String message) throws IOException
84   {
85     log.warn("Bad request: {}", message);
86     response.sendError(HttpStatus.BAD_REQUEST.value(), message);
87   }
88 }