Spring MVC拦截器HanderInterceptorAdapter示例

时间:2020-02-23 14:35:55  来源:igfitidea点击:

有时我们需要拦截传入的请求并进行一些预处理,或者在完成请求后需要执行此操作。
与我们使用的过滤器一起使用的过滤器非常相似。

有两种方法可以使用带有Spring MVC的拦截器。

HandlerInterceptor接口:

我们可以实现HandlerInterceptor接口以使用拦截器。
它有三种我们需要实施的方法。

公共布尔预处理(httpservletrequest请求,httpservletresponse响应,对象处理程序):此方法在请求移交处理程序方法之前执行此方法。

如果我们注意到它具有布尔返回类型。
如果此方法返回true,则它将转到其他拦截器或者处理程序方法。
如果此方法返回false,则此请求仅由拦截器处理,我们应该使用响应对象发送回客户端。

公共void posthandle(httpservletrequest请求,httpservletresponse响应,对象处理程序,

ModelAndView ModelDandView):当处理程序方法完成其进程但DispatcherServlet尚未处理视图时,调用此方法。
此方法可用于添加可在视图中使用的一些模型视图对象。
它可以通过将对象添加到ModelDandView对象来完成。

public void delempletion(httpservletrequest请求,httpservletresponse响应,对象处理程序,例外ex):在查看后调用此方法呈现呈现呈现,请求完全处理。

HandlerInterceptorAdapter类:

与HandlerInterceptor有关的问题是我们需要实现所有方法,但如果扩展到Astract Class叫做HandlerInterceptorAdapter,则只能实现我们想要的方法,也可以使用其他方法具有默认实现。

允许使用HandlerInterceptorAdapter类实现自定义拦截器示例。

Spring MVC拦截器示例:

我在这里使用Spring MVC Hello World示例,对此进行了很小的更改。

添加Spring MVC依赖项

在pom.xml中添加Spring依赖项。
我们需要Spring核心和SpringMVC依赖。

pom.xml.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.igi.theitroad</groupId>
  <artifactId>SpringMVCHelloWorldExample</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringMVCHelloWorldExample Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
   </dependency>
 
    <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${spring.version}</version>
  </dependency>
  </dependencies>
  <build>
    <finalName>SpringMVCHelloWorldExample</finalName> 
    
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <source>${jdk.version}</source>
            <target>${jdk.version}</target>
        </configuration>
    </plugin>
    </plugins>
 
  </build>
   <properties>
  <spring.version>4.2.1.RELEASE</spring.version>
  <jdk.version>1.7</jdk.version>
   </properties>
</project>

创建控制器

创建名为"org.igi.theitroad.springmvc.controller"的包创建一个名为"helloWorldcontroller.java"的控制器类

package org.igi.theitroad.springmvc.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class HelloWorldController {
 
 @RequestMapping("/helloworld")
 public ModelAndView hello() {
      return new ModelAndView("hello");
 }
}

创建拦截器

创建名为sampleinterceptor.java的拦截器类

package org.igi.theitroad.springmvc.interceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
public class SampleInterceptor extends HandlerInterceptorAdapter {
 
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
   throws Exception {
  request.setAttribute("blogName", "theitroad");
  return true;
 }
 
 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
   ModelAndView modelAndView) throws Exception {
  String blogName = (String) request.getAttribute("blogName");
  //We are adding some modelAndView objects here and will use it in view jsp.
  modelAndView.addObject("blogName",blogName);
  modelAndView.addObject("authorName", "igi");
 }
 
 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
   throws Exception {
  String blogName = (String) request.getAttribute("blogName");
  String authorName = (String) request.getAttribute("authorName");
  System.out.println("Request URL::" + request.getRequestURL().toString());
  System.out.println("Blog name : " + blogName);
  System.out.println("Author Name : " + authorName);
 }
}

其中我在prehandle方法中设置请求属性(blogname),我们在Posthandle方法中获取它。
我们还将两个对象添加到ModelDandView,我们将在JSP中使用。

创建视图

修改下面的index.jsp a s

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HelloWorld</title>
</head>
<body>
<a href="helloworld.html">Click here to read hello message </a>
</body>
</html>

在/web-inf /文件夹中创建hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
This is written by ${authorName} on ${blogName}
</body>
</html>

配置Spring MVC应用程序

现在我们需要配置两个文件"web.xml"和"springmvc-dispatcher-servlet.xml",我们需要在Web.xml for Spring MVC中声明DispatcherServlet。
初始化DirplatcherServlet时,Spring尝试从[servlet name] -servet.xml文件中加载应用程序上下文。
因此,在这种情况下,它将尝试加载springmvc-dispatcher-servlet.xml。

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>Archetype Created Web Application</display-name>
     <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
    <servlet>
  <servlet-name>springmvc-dispatcher</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>springmvc-dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping> 
    </web-app>

在/Web-Inf文件夹中创建名为"springmvc-dispatcher-servlet.xml"的XML文件。

<beans:beans xmlns="http://www.springframework.org/schema/mvc"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
 <context:component-scan base-package="org.igi.theitroad.springmvc.controller" 
 <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <beans:property name="prefix" value="/WEB-INF/"
  <beans:property name="suffix" value=".jsp"    
 </beans:bean>
 <interceptors>
  <interceptor>
   <mapping path="/helloworld.html" 
   <beans:bean
    class="org.igi.theitroad.springmvc.interceptor.SampleInterceptor"></beans:bean>
  </interceptor>
 </interceptors>
</beans:beans>

在/Web-Inf文件夹中创建名为"springmvc-dispatcher-servlet.xml"的XML文件。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

其中我们在上面的文件中声明了拦截器(SampleInterceptor),该文件将拦截特定的URL(/helloworld.html)。

这是时候做Maven建造了。

右键单击项目 - >运行AS - > Maven Build

将目标作为清洁安装(如下所示),然后单击运行

运行应用程序

右键单击项目 - >在服务器上运行AS - >运行

选择Apache Tomcat,然后单击"完成"