详解利用SpringMVC拦截器控制Controller返回值

时间:2022-03-23 06:55:57

背景:需求是在Controller中方法没有实现时,返回模拟结果。主要用于项目初期前台跟后台的交互,Web项目就是在前台发出请求然后后台响应并返回结果。本示例利用拦截器和注解实现跳过执行方法直接返回定义结构的功能。

通过定义一个StringResult注解,在访问方法的时候返回StringResult中的内容。通过Debug注解来定义方法是否要返回StringResult中的内容。

Debug默认为TRUE

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.tiamaes.dep.annotation;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Debug {
  boolean value() default true;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.tiamaes.dep.annotation;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StringResult {
  String value();
}

定义好注解之后写拦截器类,拦截器需要实现HandlerInterceptor

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.tiamaes.dep.interceptor;
 
import java.io.PrintWriter;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import com.tiamaes.dep.annotation.Debug;
import com.tiamaes.dep.annotation.StringResult;
 
public class DebugInterceprot implements HandlerInterceptor {
  private boolean debug = true;
   
  public boolean preHandle(HttpServletRequest request,
      HttpServletResponse response, Object handler) throws Exception {
    //首先判断是否是Debug模式(全局),如果否则使拦截器失效
    if(!this.debug) return true;
     
    if(handler instanceof HandlerMethod){
      HandlerMethod method = (HandlerMethod)handler;
      Debug isDebug = method.getMethodAnnotation(Debug.class);
      StringResult stringResult = method.getMethodAnnotation(StringResult.class);
      //如果没有@StringResult注解则跳过拦截
      //判断方法上注解的Debug值,如果否则不拦截
      if(stringResult==null||(isDebug !=null && isDebug.value() == false)){
        return true;
      }else{
        //拦截方法,并将stringResult中的内容返回给前台
        PrintWriter out = response.getWriter();
        out.print(stringResult.value());
      }
    }
     
    return false;
  }
   
  public void postHandle(HttpServletRequest request,
      HttpServletResponse response, Object handler,
      ModelAndView modelAndView) throws Exception {
    // TODO Auto-generated method stub
 
  }
 
  public void afterCompletion(HttpServletRequest request,
      HttpServletResponse response, Object handler, Exception ex)
      throws Exception {
    // TODO Auto-generated method stub
 
  }
 
  public boolean isDebug() {
    return debug;
  }
 
  public void setDebug(boolean debug) {
    this.debug = debug;
  }
   
   
 
}

XML配置

?
1
2
3
4
5
6
7
8
<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="com.tiamaes.dep.interceptor.DebugInterceprot">
      <property name="debug" value="true"/>
    </bean>
  </mvc:interceptor>
</mvc:interceptors>

Controller中的写法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.tiamaes.dep.system.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.tiamaes.dep.annotation.Debug;
import com.tiamaes.dep.annotation.StringResult;
 
@Controller
 
@RequestMapping("/test")
public class AspectTestController {
 
  @RequestMapping("/1")
  @ResponseBody
  //@Debug(false)
  @StringResult("Interceptor")
  public String test1(){
     
    return "The controller request!";
  }
}

此方法可用以在控制器中的方法没有写好的时候进行前台功能的测试,思路大概如此,更加强大的功能需要各位大神们开发。这个只是我的突发奇想,并没有实际在项目中试过。如果有人在项目中试了请告诉我效果,谢谢。

如果有人用了,建议保留StringResult注解,因为这个注解可以让你知道你的方法要返回一个什么样的结果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/jaune161/article/details/39639037