Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在控制器中使用SpringMVC处理程序拦截器?_Java_Jsp_Spring Mvc - Fatal编程技术网

Java 如何在控制器中使用SpringMVC处理程序拦截器?

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处理程序拦截器的文章,但不确定

我正在从事SpringMVC控制器项目。我有一个JSP页面,其中包含某些表单,人们会在其中键入某些条目,然后按下提交按钮

只要我在浏览器上点击这个url,它就会显示JSP页面-

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