IT이야기

Java에서 servlet 필터를 사용하여 들어오는 servlet 요청 URL을 변경하는 방법?

cyworld 2022. 5. 5. 10:17
반응형

Java에서 servlet 필터를 사용하여 들어오는 servlet 요청 URL을 변경하는 방법?

서블릿 필터를 사용하여 수신 서블릿 요청 URL을 변경하는 방법

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

?


업데이트: 아래 BalusC의 단계에 따라 다음 코드를 생각해 냈다.

public class UrlRewriteFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
            String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
            String newURI = requestURI.replace(toReplace, "?Contact_Id=");
            req.getRequestDispatcher(newURI).forward(req, res);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        //
    }
}

관련 항목:web.xml다음과 같이 보인다:

<filter>
    <filter-name>urlRewriteFilter</filter-name>
    <filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>urlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

서버측과 클라이언트측 리디렉션을 모두 예상된 결과로 시도했다.잘 됐어, 발루시 고마워!

  1. 구현하다.
  2. 메소드에서 수신인을 에 캐스팅하십시오.
  3. 길을 잡을 때 사용한다.
  4. , , 등과 같은 간단한 방법을 사용하여 관심 부분을 추출하고 새 경로를 구성하십시오.
  5. 사용 중 ServletRequest#getRequestDispatcher() 다음 RequestDispatcher#forward() 새로운 URL(SSI는 다시 잠시 동안 재전송, 브라우저 주소 표시줄에 반영되지 않), 또는 HttpServletResponse에 들어오는 ServletResponse를 요청/응답에 포워드 된 다음 HttpServletResponse#sendRedirect() 새로운 URL(클라이언트 sid에 대한 응답을 리디렉션 합니다.E리다이렉트, 브라우저 주소 표시줄에)영향을 미친다.
  6. 필터 등록 위치web.xml…에.url-pattern/*또는/Check_License/*, 컨텍스트 경로에 따라 또는 이미 서블릿 3.0에 있는 경우 대신 주석을 사용하십시오.

URL을 변경해야 하는 경우 코드에 수표를 추가하는 것을 잊지 말고, 그렇지 않은 경우 그냥 호출하고, 그렇지 않으면 무한 루프에서 자신을 호출한다.

또는 기존 타사 API를 사용하여 모든 작업을 수행할 수도 있으며, 를 들어 Apache의 UrlRewriteFilter와 같이 구성할 수 있다.mod_rewrite.

다음 규칙과 함께 Url Rewrite Filter를 사용할 준비가 된 규칙을 사용할 수 있다.

<rule>
  <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
  <to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>

자세한 내용은 예제를 참조하십시오...

BalusC의 답변 단계를 기반으로 하는 간단한 JSF Url Pretyfier 필터.필터는 /ui 경로(모든 xhtml 파일이 저장되어 있다고 가정할 경우)로 시작하는 모든 요청을 동일한 경로에 전달하지만 xhtml 접미사를 추가한다.

public class UrlPrettyfierFilter implements Filter {

    private static final String JSF_VIEW_ROOT_PATH = "/ui";

    private static final String JSF_VIEW_SUFFIX = ".xhtml";

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
        String requestURI = httpServletRequest.getRequestURI();
        //Only process the paths starting with /ui, so as other requests get unprocessed. 
        //You can register the filter itself for /ui/* only, too
        if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) 
                && !requestURI.contains(JSF_VIEW_SUFFIX)) {
            request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
                .forward(request,response);
        } else {
            chain.doFilter(httpServletRequest, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

나의 경우 봄을 사용하고 어떤 이유에서인지forrward나와 함께 일하지 않았기 때문에 나는 다음과 같이 했다.

public class OldApiVersionFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        if (httpServletRequest.getRequestURI().contains("/api/v3/")) {
            HttpServletRequest modifiedRequest = new HttpServletRequestWrapper((httpServletRequest)) {
                @Override
                public String getRequestURI() {
                    return httpServletRequest.getRequestURI().replaceAll("/api/v3/", "/api/");
                }
            };
            chain.doFilter(modifiedRequest, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {}
}

modifiedRequest를 연결하십시오.

참조URL: https://stackoverflow.com/questions/2725102/how-to-use-a-servlet-filter-in-java-to-change-an-incoming-servlet-request-url

반응형