如何在两个JSP页面中使用带有Spring Interceptor的@ExceptionHandler?

时间:2014-04-18 01:15:56

标签: java jsp spring-mvc exception-handling interceptor

我正在研究Spring MVC控制器项目。我试图在两个jsp页面上添加安全性。这意味着我将拦截来自请求的IP地址,并查看该IP地址是否是有效的IP地址。如果它不是有效IP地址,则显示错误jsp页面。

因为我在两个JSP页面上添加了这个安全性。所以我想为上面两个jsp调用显示不同的错误消息,无效的IP地址调用。

只要我在浏览器上点击url,它就会显示我的testOperationtestProcess JSP页面,如果它是有效的IP地址调用 -

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

所以我为此实现了Interceptor,然后在XML中配置了Spring MVC Interceptor。现在我正在使用以下代码检查有效的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页面。我希望在同一页面上,然后在可能的情况下恰当地显示错误消息?

1 个答案:

答案 0 :(得分:0)

我认为如果要做到这一点,我可能会使用Spring Security,所以我试着加入其中。如果您不想为这个小小的用例引入Spring Security,我也会理解。

使用HandlerInterceptor,您可以使用request.getRequestDispatcher(path)来处理响应。如果我是你,我会调度到Spring MVC端点,以便DispatcherServlet处理内容协商并查看我的解决方案(因此调度程序中的path将映射到@Controller@RestController)。我也可能想要使用AOP拦截器而不是HanderInterceptor,但可能有理由不这样做,一旦我尝试它就会变得清晰。

BTW我认为如果你正确设置服务器,你通常可以期望request.getRemoteAddr()指向X-Forwarded-For值(例如在Tomcat中有RemoteIpValve这样做)。或者,如果您不控制容器,则可以将该逻辑提取到Filter