2014-04-18 30 views
3

我正在開發Spring MVC控制器項目。我試圖在兩個jsp頁面上添加安全性。這意味着我將攔截來自該請求的IP地址並查看該IP地址是否是有效的IP地址。如果它不是有效的IP地址,則顯示錯誤的jsp頁面。如何對兩個JSP頁面使用@ExceptionHandler和Spring Interceptor?

因爲我在兩個JSP頁面上添加了這個安全性。所以我想爲上面的兩個jsp調用顯示不同的錯誤消息來調用無效的IP地址。

只要我打以下網址瀏覽器,它會顯示我的testOperationtestProcess JSP頁面,如果它是一個有效的IP地址呼叫 -

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

所以我實現了攔截該再配置的Spring XML中的MVC攔截器也是如此。現在我用下面的代碼檢查有效的IP地址大小寫。

@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; 
    } 
} 

在我的context.xml文件 -

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

這是可以做到的,無論如何?現在,正如我上面提到的,我需要顯示不同的錯誤jsp消息,以獲取無效的ip地址調用,具體取決於調用哪個頁面。做這個的最好方式是什麼?

如果可能的話,我不想重定向到其他JSP頁面。我想要在同一頁面上,然後適當地顯示錯誤信息,如果可能的話?

回答

0

我想如果要做到這一點,我可能會使用Spring Security,所以我會試着去解決這個問題。如果你不想爲這個小用例引入Spring Security,我也會理解。

使用HandlerInterceptor,您可以使用request.getRequestDispatcher(path)來處理響應。如果我是你,我會派發到Spring MVC端點,以便DispatcherServlet爲我處理內容協商和視圖分辨率(因此調度器中的path將映射到@Controller@RestController)。我也可能會嘗試使用AOP攔截器而不是HanderInterceptor,但可能有理由不這樣做,只有我嘗試了它纔會變得清晰。

順便說一句如果你正確設置了服務器(例如在Tomcat中有一個RemoteIpValve那麼做),我認爲你通常可以預期request.getRemoteAddr()指向X-Forwarded-For的值。或者,如果您不控制容器,則可以將該邏輯提取爲Filter