복붙노트

[SPRING] 저지에 Spring의 HandlerInterceptor와 비슷한 인터셉터가 있습니까?

SPRING

저지에 Spring의 HandlerInterceptor와 비슷한 인터셉터가 있습니까?

저지 2.x에서 웹 서비스에 대한 경로와 일치하는 요청, 응답 및 메소드에 대한 참조를 제공하는 인터셉터가 필요합니다.

Spring의 HandlerInterceptor와 비슷한 것.

요구 사항 :

봄 상당 코드 :

public class WebServiceInterceptor implements HandlerInterceptor {
     @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        try {
            SkipWebServiceIntercept skipWebService = handler.getClass().getAnnotation(SkipWebServiceIntercept.class);

            if (skipWebService != null) {
                return Boolean.TRUE;
            }

            ...

            if(securityFails)
            {
                if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
                    response.setCharacterEncoding("utf-8");
                    response.setContentType("application/json");
                    PrintWriter out = response.getWriter();
                    String json;
                    ...
                    out.println(json);
                    return Boolean.FALSE;
                }
                else {
                    response.sendRedirect(redirectUrl);
                }
            }
            else
            {
                return Boolean.TRUE;
            }
        }catch (Exception e) {
            log.error("Exception in preHandle, redirecting to Login page", e);
            return LoginUtil.redirectToLogin(request, response);
        }
    }
}

나는

필터를 사용하지 않고도이를 달성 할 수있는 방법이 있습니까? 해당 웹 서비스가있는 경우에만이 처리가 필요하기 때문입니다. 반면에 / *가있는 필터는 자원을 찾을 수없는 경우에도 항상이 유효성 검사를 수행합니다.

편집하다: 감사합니다 @ peeskillet 대답 이것은 어떻게 구현 한 것입니다.

@Provider
public class ResourceInterceptor implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {

        System.out.println("Resource Interceptor called");

        if (resourceInfo.getResourceClass() != null
                && resourceInfo.getResourceClass().getAnnotation(SkipWebServiceIntercept.class) != null)
            return;

        context.register(LoginFilter.class);
    }

}


@Slf4j
public class LoginFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest      request;

    @Context
    private ServletContext          servletContext;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        try {


WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);

CookieAuthenticator cookieAuthenticator = springContext.getBean(CookieAuthenticator.class);

HttpSession session = request.getSession(true);

...
...
String json = gson.toJson(resposeJson);

Response response = new ResponseBuilderImpl().encoding(StandardCharsets.UTF_8.name())
                        .type(MediaType.APPLICATION_JSON).entity(json).build();
requestContext.abortWith(response);
...
...
URI uri = new URI(baseUrl + redirectUrl + "?refback=" + url);
requestContext.abortWith(Response.temporaryRedirect(uri).build());
...

두 접근법 모두 Spring의 HandlerInterceptor와 비슷하게 완벽하게 작동했습니다.

해결법

  1. ==============================

    1.필터를 등록하는 방법에는 여러 가지가 있습니다.

    필터를 등록하는 방법에는 여러 가지가 있습니다.

    참조 :

  2. from https://stackoverflow.com/questions/35727497/is-there-an-interceptor-in-jersey-similar-to-that-of-springs-handlerinterceptor by cc-by-sa and MIT license