Java 如何在控制器中使用SpringMVC处理程序拦截器?
我正在从事SpringMVC控制器项目。我有一个JSP页面,其中包含某些表单,人们会在其中键入某些条目,然后按下提交按钮 只要我在浏览器上点击这个url,它就会显示JSP页面-Java 如何在控制器中使用SpringMVC处理程序拦截器?,java,jsp,spring-mvc,Java,Jsp,Spring Mvc,我正在从事SpringMVC控制器项目。我有一个JSP页面,其中包含某些表单,人们会在其中键入某些条目,然后按下提交按钮 只要我在浏览器上点击这个url,它就会显示JSP页面- http://localhost:8080/testweb/testOperation 现在我应该做的是——一旦点击上面的url,我就会从请求头截取IP地址,如果该IP地址在我的访问列表中,那么只有我会显示我的实际jsp页面,否则我会显示一个错误jsp页面 我读了一些关于SpringMVC处理程序拦截器的文章,但不确定
http://localhost:8080/testweb/testOperation
现在我应该做的是——一旦点击上面的url,我就会从请求头截取IP地址,如果该IP地址在我的访问列表中,那么只有我会显示我的实际jsp页面,否则我会显示一个错误jsp页面
我读了一些关于SpringMVC处理程序拦截器的文章,但不确定如何在我的示例中实现它,因为这是我第一次使用SpringMVC,所以有点困惑
下面是我的代码库——只要我在浏览器上点击这个url-
http://localhost:8080/testweb/testOperation
它自动转到下面的方法,然后在浏览器上显示我的testOperation
jsp页面,它工作正常
@RequestMapping(value = "testOperation", method = RequestMethod.GET)
public Map<String, String> testOperation() {
final Map<String, String> model = new LinkedHashMap<String, String>();
return model;
}
这应该可以使用拦截器或servlet过滤器实现。使用拦截器,代码看起来有点像这样:
@Component
public class IpCheckingInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// Your header-checking code
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
if (<ipAddress not OK>) {
throw new ForbiddenException("You are not allowed to access this page");
}
return true;
}
}
@组件
公共类IpCheckingInterceptor扩展了HandlerInterceptorAdapter{
公共布尔预处理(HttpServletRequest请求、HttpServletResponse响应、对象处理程序)引发异常{
//您的头检查代码
字符串ipAddress=request.getHeader(“X-FORWARDED-FOR”);
如果(ipAddress==null){
ipAddress=request.getRemoteAddr();
}
如果(){
抛出新的禁止例外(“您不允许访问此页面”);
}
返回true;
}
}
根据Spring应用程序的配置方式,您可能需要在XML配置中注册拦截器,或者可以根据约定自动注册拦截器-可以在此处找到一些示例:如何尝试使用
Servlet过滤器检查请求的ip地址?感谢Michal的帮助。在这个预处理方法之后有一个简单的问题。接下来我应该做什么来显示实际的testOperation jsp
。您给我的示例部分很有意义,但是在这之后,我如何确保IP地址是否在我的ok列表中,然后我应该显示testOperation jsp
。有什么想法吗?除非你做一些“特殊”的事情,比如抛出一个异常,否则请求将照常进行,因此如果客户端请求testOperation.jsp,而你没有在拦截器中抛出异常,客户端将看到他们请求的页面。很好。。那真的很酷。基本上,这只是一个介于两者之间的拦截器,所以调用首先进入prehandle,如果成功,则只进入我上面的代码,正如我在问题中所做的。。对吧?酷。。所以它不是特定于任何JSP页面的,对吗?无论我请求什么页面,第一个调用总是转到preHandle
,如果成功,下一个调用就会转到我请求的特定页面。如果您只想将这种行为添加到一个页面,那么可以将HttpServletRequest
作为参数添加到控制器中的请求处理方法中,并在其中执行IP检查。
@Component
public class IpCheckingInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// Your header-checking code
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
if (<ipAddress not OK>) {
throw new ForbiddenException("You are not allowed to access this page");
}
return true;
}
}