Spring MVC 拦截器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33366229/article/details/73430880
Spring MVC拦截器的配置
.创建拦截器并实现HandleInterceptor接口
.将Spring MVC配置文件中以bean的形式注册拦截器
可以将bean配置在interceptors标签中,这时默认拦截所有路径
可以在interceptors的子标签interceptor中配置bean,同时指定拦截规则mapping-path
示例
<mvc:interceptors>
   <mvc:interceptor>
          <mvc:mapping path="拦截路径(可使用正则表达式)">
          <bean class="拦截器类的全限定名(包名+类名)">
   </mvc:interceptor>
</mvc:interceptors>
------------------------------------------------------
拦截器的方法介绍
HandleInterceptor的三个方法
preHandler
返回值:是否需要将当前请求拦截下来
false:请求将被终止
true:请求会被继续运行
参数:HttpServletRequest, HttpServletResponse, Object
Object:被拦截的请求目标对象(就是拦截的Controller方法的类对象)
postHandler
参数:HttpServletRequest, HttpServletResponse, Object, ModelAndView
ModelAndView:改变显示的视图(setViewName)或者修改发往视图的方法
(具体可以参考HandleInterceptor接口的源码)
afterCompletion
作用:做资源的销毁,如关闭IO流
---------------------------------------------
拦截器的使用场景
使用原则:处理所有请求的共同问题
. 解决乱码问题:调用参数HttpRequest对象的setCharacterEncoding方法,传入"utf-8"
. 解决权限验证问题:
调用参数HttpRequest对象的getSession方法得到session对象,再通过session对象的getAttribute方法得到相应的校验参数并继续校验处理

若校验不通过,使用HttpRequest对象的getRequestDispather方法转发到登陆界面


Controller

 

@RequestMapping("/helloInterceptor")
	public String helloInterceptor(HttpServletRequest request){
		String username=request.getParameter("username");
		request.setAttribute("username",username );
		System.out.println(username);
		request.setAttribute("msg", "这里是Controller的消息");
		return  "home2";
	}


Interceptor


package com.imooc.mvcdemo.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TestInterceptor implements HandlerInterceptor {

	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
     System.out.println("执行了afterCompletion:作用:做资源的销毁,如关闭IO流");
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		arg3.addObject("msg", "这里传回的是拦截器修改之后的消息");
        System.out.println("执行了postHandle");
       // arg3.setViewName("/other.jsp");  可以改变响应的视图
	}

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("执行了preHandle 如果返回值为false 将拒绝这个请求不在执行接下来的操作");
		return true;
	}

}

home.jsp

<form  action="/hello2/helloInterceptor" method="get">
   <input type="text" name="username" value=""/>
   <input type="submit" value="提交"/>
</form>

home2.jsp


<body>


 ${username}<br>
 ${msg}
</body>

mvc-dispatcher-servlet.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
        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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        
        <!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用, 提供其相关的Spring MVC配置 -->

	<!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required 
		@Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 -->
	<context:annotation-config />
	
	<!-- DispatcherServlet上下文, 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
	<context:component-scan base-package="com.imooc.mvcdemo">
	   
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
			</context:component-scan>
			<!-- 
			注册 拦截器   拦截所用的请求
			<mvc:interceptors>
			   <bean class="com.imooc.mvcdemo.interceptor.TestInterceptor"></bean>
			</mvc:interceptors> -->
	<!-- 制定拦截规则 -->
         <mvc:interceptors>
            <mvc:interceptor>
            <mvc:mapping path="/hello2/helloInterceptor"/>
                   <bean class="com.imooc.mvcdemo.interceptor.TestInterceptor"></bean>
            </mvc:interceptor>
         </mvc:interceptors>
	<!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。 
	DefaultAnnotationHandlerMapping annotation-driven HandlerMapping -->

	<!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
	<mvc:annotation-driven />

	<!-- 静态资源处理, css, js, imgs  不加这个就访问不到静态资源-->
	<mvc:resources mapping="/resources/**" location="/resources/" />
	
	<!-- 配置ViewResolver 
	可以配置多个ViewResolver 使用order属性排序 
	InternalResourceViewResolver放在最后 
	因为它必定会返回一个对象-->
		<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/jsps/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	
	
	</beans>

截图:



展开阅读全文

没有更多推荐了,返回首页