拦截器

发表时间:2017-07-18 18:37:59 浏览量( 39 ) 留言数( 0 )

学习目标:

1、了解Spring的拦截器的定义和使用


学习过程:

一、拦截器

1、代码实现

spring也有类似struts2的拦截器,需要实现HandlerInterceptor接口就可以了。代码如下:

  public class Myinterceptor implements HandlerInterceptor{

	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("释放资源");

		
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		System.out.println("进入控制器后");
		
	}

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2) throws Exception {
		System.out.println("进入控制器后");
		return true;
	}

}

2、拦截器配置

当然也是一样需要在配置文件中配置了,修改applicationContext.xml文件

<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/hello/*"></mvc:mapping>
			<bean class="com.interceptor.Myinterceptor">
			</bean>
		</mvc:interceptor>
	</mvc:interceptors>

表示拦截所有/hello下面的所有的控制器。

二、防止重复提交的实例:

Struts2有防止重复提交的拦截器。但是Spring需要自己写一个。当然原理也是非常简单的。这里我们在封装一下。使用注解的方式实现。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {
	boolean tokenSet() default false;//需要设置token

	boolean tokenCheck() default false;//需要检查token
}

定义拦截器

public class TokenInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		if (handler instanceof HandlerMethod) {
			HandlerMethod handlerMethod = (HandlerMethod) handler;
			Method method = handlerMethod.getMethod();
			Token tokenAnnotation = method.getAnnotation(Token.class); // 判断是否有标注

			if (tokenAnnotation != null) {
				boolean isTokenCheck = tokenAnnotation.tokenCheck();
				if (isTokenCheck) {
					String token = (String) request.getSession().getAttribute("token");
					String paramToken = request.getParameter("token");

					if (StringUtils.isEmpty(token) || StringUtils.isEmpty(paramToken)) {
						response.sendRedirect("/error/token.html");
						return false;
					}

					if (!token.equals(paramToken)) {
						response.sendRedirect("/error/token.html");
						return false;
					}
					
					request.getSession().removeAttribute("token");
					return true;
				}
			}
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		if (handler instanceof HandlerMethod) {
			HandlerMethod handlerMethod = (HandlerMethod) handler;
			Method method = handlerMethod.getMethod();
			Token tokenAnnotation = method.getAnnotation(Token.class); // 判断是否有标注

			if (tokenAnnotation != null) {
				boolean isTokenSet = tokenAnnotation.tokenSet();

				if (isTokenSet) {
					request.getSession().setAttribute("token", UUIDUtil.getUuid());
				}
			}
		}

	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub

	}

}

配置

    <!-- token 拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/exe/**" />
			<mvc:mapping path="/add/**" />
			<mvc:mapping path="/update/**" />
			<mvc:exclude-mapping path="/assets/**"/>
			<bean class="com.liubao.frontview.myinterceptor.TokenInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

这样已经是定义完毕了。如果需要使用,只需要在control使用对应的注解

	
	@Token(tokenSet=true)
	@RequestMapping(value = "/toAdd")
	public ModelAndView toAdd() {
		ModelAndView modelAndView=new ModelAndView();
		modelAndView.setViewName("add");
		return modelAndView;
	}
	
	@Token(tokenCheck=true)
	@RequestMapping(value = "/add")
	public ModelAndView add() {
		ModelAndView modelAndView=new ModelAndView();
		modelAndView.setViewName("success");
		return modelAndView;
		
	}

然后页面也是需要

 <input type="hidden" name="token" value="token">