拦截器

重难点: 掌握拦截器的配置及使用

 

拦截器 :   ·拦截器,全称处理器拦截器,类似过滤器(Filter)

                   ·基于反射机制,用于对处理器进行预处理和后处理(过滤器是基于Servlet)

拦截器原理:

           前端控制器 收到请求后,通过映射处理器获取处理流程链,

                                                                                           处理流程链包含:拦截器和处理器

                    ·如果没有配置拦截器,那么直接由处理器处理请求;

                    ·如果配置了拦截器,那么按照配置文件顺序执行拦截器及处理器

拦截器执行流程

拦截器的配置及使用

         ·框架提供了拦截器接口,通过实现HandlerInterceptor 接口可以完成拦截器的实现

         ·三个方法:

              ·preHandler() : 预处理回调方法,实现处理器的预处理

              ·postHandler() : 后处理回调方法,返回视图之前

              ·afterCompletion() : 整个请求处理完毕回调方法,返回视图之后

拦截器的实现

  • 实现HandlerInterceptor 接口,编写自定义拦截器

Implements HandlerInterceptor

/**
 * 自定义拦截器
 * @author Administrator
 *
 */
public class KgcInterceptor implements HandlerInterceptor {

//	预处理方法,在控制器处理请求之前执行
//	返回值为true :请求会被处理器继续执行
//	返回值false : 请求会被截断
//	object 参数是处理请求的目标控制器
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object obj) throws Exception {
		System.out.println("preHandle执行了");
//		System.out.println("请求处理开始时间:"+System.currentTimeMillis());
		System.out.println(obj.toString());
		KgcController kgc = (KgcController)obj;
		kgc.setUserName("课工场");
		return true;
	}
	

//	后处理方法,处理请求之后,返回视图之前执行
//	modelAndView 对象是请求最终返回的模型视图对象,与控制器当中返回的是同一个
	public void postHandle(HttpServletRequest request, HttpServletResponse response,
			Object obj, ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle执行了");
//		添加了拦截器数据到 ModelAndView 对象中
//		modelAndView.addObject("postHandlerMsg","这是postHandler添加的数据");
//		修改控制器返回的业务数据
//		Map<String,Object> model = modelAndView.getModel();
//		String msg = model.get("sayHelloMsg").toString();
//		System.out.println("控制器添加的数据:"+msg);
//		model.put("sayHelloMsg", "这是postHandler修改后的数据");
		System.out.println(obj.toString());
	}

//	后处理方法,处理请求之后,返回视图之后哦执行
//	可以用来监控方法执行效率以及性能
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse response, Object obj, Exception exception)
			throws Exception {
		System.out.println("afterCompletion执行了");
//		System.out.println("请求处理结束时间:"+System.currentTimeMillis());
		System.out.println(obj.toString());
	}

}
  • 配置文件

  <mvc:interceptors>

	<!-- 拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/kgc/*"/>
			<bean class="com.kgc.interceptors.KgcInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

    注意: 如果需要拦截所有请求 <mvc:mapping path=”/**”

            一个 * 表示: 匹配0或者任意数量的字符

            两个 * 表示: 匹配0或者更多的目录

  • 编写控制器验证效果

/**
 * 验证拦截器方法的执行顺序
 * @author Administrator
 *
 */
@Controller
@RequestMapping("/kgc")
public class KgcController {
	private String userName;
	
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	
	@RequestMapping("sayHello.do")
	public String sayHello(Model model){
		System.out.println("sayHello执行了");
		model.addAttribute("sayHelloMsg","你好"+userName);
//		model.addAttribute("sayHelloMsg", "这是sayHello的数据");
		return "success";
	}

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拦截器类 需要两个配合使用这里只有一个 @Configuration public class ServletContextConfig extends WebMvcConfigurerAdapter { public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/"); super.addResourceHandlers(registry); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerMyInterceptorAdapter()).addPathPatterns("/**") .excludePathPatterns("/") // .excludePathPatterns("/expressions/getExpressionsList") .excludePathPatterns("/loginInfo/getCordByIsPhone") .excludePathPatterns("/loginInfo/login11") //token失效跳轉 .excludePathPatterns("/loginInfo/insertLoginInfo") //注册 .excludePathPatterns("/loginInfo/login") //登录 .excludePathPatterns("/upload") //上传文件 .excludePathPatterns("/uploadListen") //上传文件 .excludePathPatterns("/admin/user/goLogin") //后台跳转登录 .excludePathPatterns("/admin/user/login") //后台登录 .excludePathPatterns("/loginInfo/getLoginInfo") //忘记密码 .excludePathPatterns("/loginInfo/getCord") //短信验证码 .excludePathPatterns("/loginInfo/getIsLoginInfo") //判断验证码&&登录 .excludePathPatterns("/loginInfo/getIsLoginInfo1") //判断验证码 .excludePathPatterns("/loginInfo/setPassWord") //设置密码 ; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } @Component public class HandlerMyInterceptorAdapter implements HandlerInterceptor { @Autowired private HeartbeatServiceImpl heartbeatService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { String url = request.getRequestURI(); if (url.contains("admin")) { User user = (User) request.getSession().getAttribute("user"); try { if (user.equals(null)) { response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } else { return true; } }catch (Exception e){ response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } }else { String token = request.getHeader("token"); if (token != null) { Jedis jedis = new Jedis(com.sevenSteps.util.RedisConfig.HOST, RedisConfig.PORT); String s = jedis.get(token); if(token.equals(s)) { heartbeatService = SpringUtil.getBean(HeartbeatServiceImpl.class); return heartbeatService.setOutDate(token); }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值