Created
April 25, 2019 01:49
-
-
Save mike-neck/0f84677c62870b8dd2e0dd4d80d7f3fd to your computer and use it in GitHub Desktop.
フィルターの実験した
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import groovy.transform.Canonical | |
import org.springframework.http.converter.json.* | |
import com.fasterxml.jackson.databind.* | |
@Canonical | |
class Bar { | |
String fooBar | |
} | |
@RestController | |
@RequestMapping('/foo') | |
class Foo { | |
@PutMapping(consumes = 'application/json', produces = 'application/json') | |
def put(@RequestBody Bar bar) { | |
println(bar) | |
bar | |
} | |
} | |
@Configuration | |
class Config { | |
@Bean | |
IntRange range() { | |
1..30 | |
} | |
@Bean | |
ObjectMapper objectMapper() { | |
def mapper = new ObjectMapper() | |
mapper.propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE | |
mapper | |
} | |
} | |
class AppError { | |
boolean success | |
String message | |
} | |
import org.springframework.web.filter.OncePerRequestFilter | |
import javax.servlet.ServletRequest | |
import javax.servlet.ServletResponse | |
import javax.servlet.FilterChain | |
import javax.servlet.ServletException | |
import javax.servlet.http.HttpServletRequest | |
import javax.servlet.http.HttpServletResponse | |
import org.slf4j.Logger | |
import org.slf4j.LoggerFactory | |
@Component | |
class AppFilter extends OncePerRequestFilter { | |
Logger logger = LoggerFactory.getLogger(AppFilter) | |
final ObjectMapper mapper | |
final IntRange range | |
AppFilter(ObjectMapper objectMapper, IntRange range) { | |
this.mapper = objectMapper | |
this.range = range | |
} | |
@Override | |
void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { | |
def h = request.getHeader('X-RANGE') | |
if (!h) { | |
logger.info('invalid request : no x-range, path: {}, remote: {}', request.requestURI, request.remoteAddr) | |
invalidRequest(response) | |
return | |
} | |
def r = h as int | |
if (!(r in range)) { | |
logger.info('invalid request : range: {}, path: {}, remote: {}', r, request.requestURI, request.remoteAddr) | |
invalidRange(r, response) | |
return | |
} | |
chain.doFilter(request, response) | |
} | |
void invalidRequest(HttpServletResponse response) { | |
response.setStatus(400) | |
response.writer << mapper.writeValueAsString(new AppError(success: false, message: 'invalid request')) | |
response.writer.flush() | |
} | |
void invalidRange(int r, HttpServletResponse response) { | |
response.setStatus(400) | |
response.writer << mapper.writeValueAsString(new AppError(success: false, message: "${r} is not in valid range")) | |
response.writer.flush() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment