2017-12-11 7 views
0

일부 GET 메소드의 로그인 페이지를 건너 뛰기 위해 서블릿 필터를 추가했습니다. 요청이/DataService로 시작되면 아래에 설명 된 Get 메소드로 리디렉션되어야합니다.서블릿 필터가 무한 루프로 요청을 전달합니다.

필터 구현 :

@Override 
    public void doFilter(final ServletRequest arg0, final ServletResponse arg1, final FilterChain filterChain) 
      throws IOException, ServletException { 
     final HttpServletRequest request = (HttpServletRequest) arg0; 
     final HttpServletResponse response = (HttpServletResponse) arg1; 
     final HttpSession session = request.getSession(); 

     final String id = (String) session.getAttribute("id"); 
if ((request.getRequestURL().indexOf("/login")) < 0) { 
     if (id == null) { 
      error = "authentication required"; 
     } 
    } 
     if (null == error) { 
      filterChain.doFilter(request, response); // happy flow 
     } else if (request.getServletPath().startsWith("/DataService")) { 
      // Need to redirect to one GET method 

     } else { // unauthorized flow 
      request.getRequestDispatcher("/login").forward(request, response); 
     } 
    } 

이 방법은

@RestController 
@RequestMapping("/DataService") 
public class DataController { 

    @Autowired 
    private DataLoaderService dataLoader; 

    @RequestMapping(value = "/loadAllStaticData", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 
    @ResponseBody 
    public Boolean loadAllData() throws DataLoadException { 
     DataLoader.loadAllData(); 
     return true; 
    }. 

방법의 web.xml을 사용하고 있지 않다 loadAllData() DataController.I의 방법으로 필터 방법을에서 요청을 전달하는 데 도움이 GET과 필터 구성을 위해 Java 구성을 사용했습니다. 나는 스 니펫 아래에 피곤했지만 dofilter 메서드로 다시 리디렉션됩니다.

else if (request.getServletPath().startsWith("/DataService")) { 
      request.getRequestDispatcher(request.getServletPath()).forward(); 
+0

오류 변수는 어디에 정의되어 있습니까? 무엇에 의존 하는가? https://stackoverflow.com/questions/2725102/how-to-use-a-servlet-filter-in-java-to-change-an-incoming-servlet-request-url 양식과 비슷합니다. –

+0

저는 믿습니다. '/ DataService/loadAllStaticData'와 같은 것으로 리디렉션해야합니다. –

+0

@WilliamBurnham 죄송합니다. 질문이 업데이트되었습니다. – Ramkumar

답변

0

나는이 ID에 대한 유효성 검사기를 제안 할 것입니다. 리디렉션이 아닌 앞으로가되어야하는 이유는 무엇입니까?

// get the id to validate 
if (isValid(id)) { 
    filterChain.doFilter(request, response); 
} else { 
    if (request.getServletPath().starts with("/DataService")) { 
    response.sendRedirect("/DataService/loadAllData"); 
    } else { 
     String error = "something"; 
     // do whatever you want with your error message 
     response.send redirect("/login"); 
    } 
} 

// make your boolean isValid method