我正在研究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地址。
答案 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"/>
将完成这项工作:)