2014-04-18 1 views
3

저는 스프링 MVC 컨트롤러 프로젝트를 진행하고 있습니다. 두 JSP 페이지에 보안을 추가하려고합니다. 의미 나는 요청에서 나오는 IP 주소를 가로 채고 그 IP 주소가 유효한 IP 주소인지 여부를 확인합니다. 유효한 IP 주소가 아닌 경우 오류 JSP 페이지를 표시하십시오.@ExceptionHandler를 Spring 인터셉터와 함께 두 JSP 페이지에 사용하는 방법은 무엇입니까?

저는이 보안을 두 개의 JSP 페이지에 추가하고 있습니다. 그래서 잘못된 IP 주소 호출에 대한 위의 두 jsp 호출에 대해 다른 오류 메시지를 표시하려고합니다.

마자 브라우저에 URL을 아래 공격으로 유효한 IP 주소 전화의 경우, 내 testOperationtestProcess JSP 페이지를 표시합니다 -

http://localhost:8080/testweb/testOperation 
http://localhost:8080/testweb/testProcess 

그래서 나는이의 인터셉터를 구현하고 구성 봄 XML의 MVC 인터셉터. 이제 아래 코드와 함께 올바른 IP 주소를 확인합니다. 내의 context.xml 파일에서

@Component 
public class IpCheckingInterceptor extends HandlerInterceptorAdapter { 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     String requestURI = request.getRequestURI(); 
     System.out.println(requestURI); 

     String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
     if (ipAddress == null) { 
      ipAddress = request.getRemoteAddr(); 
     } 
     if (!isValid(ipAddress) && requestURI.equalsIgnoreCase("/testweb/testOperation")) { 
      // need to show a proper error message on the jsp 

      return false; 
     } else if (!isValid(ipAddress) && requestURI.equalsIgnoreCase("/testweb/testProcess")) { 
      // need to show a below JSON response as an error on the browser 
      // {"response":"You are not authorized to make a call.","error":"AUTHORIZATION_ERROR","status":"ERROR"} 

      return false; 
     } 

     return true; 
    } 
} 

-

<mvc:interceptors> 
    <bean class="com.testing.interceptor.IpCheckingInterceptor" /> 
</mvc:interceptors> 

이 어쨌든 할 수 있습니까? 이제 위에서 언급 한 것처럼 어떤 페이지가 호출되었는지에 따라 잘못된 IP 주소 호출에 대해 다른 오류 JSP 메시지를 표시해야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

가능한 경우 다른 JSP 페이지로 리디렉션하고 싶지 않습니다. 같은 페이지에 있고 가능한 경우 오류 메시지를 적절히 표시하고 싶습니다.

답변

0

이 작업을 수행하려면 어쨌든 스프링 보안을 사용하는 것이 좋을 것입니다. 그래서 시도하고 연결하려고합니다. 이 작은 유스 케이스만으로 Spring Security를 ​​가져오고 싶지 않다면 그것도 이해할 것입니다.

HandlerInterceptor을 사용하면 request.getRequestDispatcher(path)을 사용하여 응답을 처리 할 수 ​​있습니다. 만약 내가 당신이라면 DispatcherServlet이 콘텐트 협상을 처리하고 나를 위해 해상도를 볼 수 있도록 스프링 MVC 엔드 포인트로 전달할 것이다. 따라서 디스패처의 path@Controller 또는 @RestController으로 매핑된다. 나는 또한 HanderInterceptor 대신 AOP 인터셉터를 사용하려고 시도 할 수도 있지만, 한번 시도한 후에 만 ​​명확 해지는 이유가있을 수 있습니다.

BTW 서버를 올바르게 설정하면 (예 : Tomcat에는 RemoteIpValve이있는 경우) request.getRemoteAddr()X-Forwarded-For 값을 가리킬 것으로 예상됩니다. 또는 컨테이너를 제어하지 않으면 로직을 Filter으로 추출 할 수 있습니다.

관련 문제