如何通过在Spring MVC中的JSP页面上拦截请求来显示不同的错误jsp页面?

时间:2014-04-17 18:54:05

标签: java jsp spring-mvc interceptor

我正在研究Spring MVC控制器项目。我有7-8个jsp页面的不同JSP页面。

人们将从不同的IP地址调用这些不同的JSP页面,这意味着来自不同的机器。

现在我要做的是 - 我将拦截呼叫并从中提取IP地址,如果IP地址在我们的有效列表中,那么我只会显示他们要求的jsp页面,否则我将显示错误jsp页面。

现在还有另一个棘手的情况。我不想对我拥有的所有JSP页面进行上述检查,我只想在两个JSP页面上执行此操作。这意味着如果人们要求这两个JSP页面,那么我只会进行上述检查,否则我不想进行上述IP地址检查。

下面是我需要进行上述IP地址检查的两个jsp代码。意思是如果人们从我们列表中没有的IP地址请求jsp页面下面,我想显示错误jsp页面。

以下是我的testWorkflow.jsp -

@RequestMapping(value = "testWorkflow", method = RequestMethod.GET)
public @ResponseBody
ZookeeperResponse testWorkflow(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc) {

    // if ipAddress is not in the valid list
    // then show error jsp page.

    // some code here related to my JSP page


    }

以下是我的testOperation.jsp -

@RequestMapping(value = "testOperation", method = RequestMethod.GET)
public Map<String, String> testOperation() {

    // if ipAddress is not in the valid list
    // then show different error jsp page.

    // some code here related to my JSP page

    }

以下是我可以用来从标题中提取IP地址的代码 -

//is client behind something?
String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}       

现在我不确定在调用时如何限制无效的ip地址,如果它们无效,则显示错误jsp页面。我需要为上面两个jsp页面调用显示不同的错误jsp页面。

这可能吗?实现这一目标的最佳方法是什么?我刚刚开始使用Spring MVC控制器,所以不确定我有哪些选项以及解决问题的最佳方法是什么?

任何建议和示例都会有很大的帮助。

注意: -

我已经在代码本身中有了有效的IP地址列表。所以我不需要在某个文件或xml中定义那些有效的IP地址。

1 个答案:

答案 0 :(得分:1)

有一些简单的事情可以解决你的问题。

您可以使用拦截器,它不需要任何外部模块。

代码:

public class LoginInterceptor extends HandlerInterceptorAdapter {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestUri = request.getRequestURI();
        //Only check on several pages not all
        //Check if user is requesting the two JSP pages
        if (requestUri.startsWith(...)) {
        //Yes, user is requesting the two JSP
            if(/*Check if ip address is on the list*/) {
                //Yes, it is.
                 if (/*check sth else maybe?*/) {
                      //test passes
                      return true;
                 } else {
                      //test fails.
                      response.sendRedirect(request.getContextPath() + "error_1";
                       return false;
                 }
            } else {
                //oops, not on the list, redirect to error url
                response.sendRedirect(request.getContextPath() + "error_2";
                return false;
            }

        } else {
        //no need to check, just grant access
        return true;
        }
    }
}

配置也很简单:

<mvc:interceptors>
    <bean id="loginInterceptor" class="....LoginInterceptor" />
</mvc:interceptors>

现在,假设用户的IP地址不在列表中,他或她被重定向到错误页面url(例如abc.com/error_denied)。在这里,我假设您没有映射到该URL的控制器,然后<mvc:view-controller path="/error_denied" view-name="error.jsp"/>将完成这项工作:)