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

原创 2014年09月28日 11:54:25

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

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

Debug默认为TRUE

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


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

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配置

    <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中的写法

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注解,因为这个注解可以让你知道你的方法要返回一个什么样的结果。

敏捷是一条很长的路,摸索着前进着!!






版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring MVC 中 HandlerInterceptorAdapter的使用 预处理、后处理、返回处理

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 ...

SpringMVC学习记录(七)--拦截器的使用

SpringMVC的请求如下面这种图所示: 可以看出所有的请求都要通过Dispatherservlet来接收,然后通过Handlermapping来决定使用哪个控制器,再根据ViewResolver...

Spring拦截器实现controller层json数据返回

Controller层的作用是处理业务逻辑并返回数据,那怎么返回数据呢?接口的请求通过HttpServletRequest和HttpServletResponse实现前后端的交互,ServletRes...

由HandlerInterceptor.afterCompletion引起的对DispatcherServlet异常处理分析!

该方法的签名: void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object h...

SpringMVC中使用Interceptor拦截器顺序等

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那...

spring mvc Controller层拦截器配置教程代码实例

spring mvc Controller层拦截器配置教程代码实例 源代码下载地址:http://www.zuidaima.com/share/1825298701863936.htm...

通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录

java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务...
  • zzy7075
  • zzy7075
  • 2016年10月25日 17:48
  • 4064

Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制

拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制拦截器Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInt...

spring拦截器使用及拦截器中获取Controller实例

1,首先是配置,在spring-mvc的配置文件中加上 2,编写拦截器类 package cn.hydom.ztc.ztc_cp.controller.common...

SpringMVC 拦截返回值,并自定义

有关取代mvc:annotation-driven使用自定义配置请看: http://blog.csdn.net/cml_blog/article/details/45222431 1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用SpringMVC拦截器控制Controller返回值
举报原因:
原因补充:

(最多只允许输入30个字)