Skip to content

Instantly share code, notes, and snippets.

@mike-neck
Created April 25, 2019 01:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mike-neck/0f84677c62870b8dd2e0dd4d80d7f3fd to your computer and use it in GitHub Desktop.
Save mike-neck/0f84677c62870b8dd2e0dd4d80d7f3fd to your computer and use it in GitHub Desktop.
フィルターの実験した
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