您的位置:首页 > 编程语言 > Java开发

springMVC拦截器 interceptor!

2017-06-20 20:46 525 查看
过滤器filter和拦截器interceptor功能非常相似,都可以用来解决一些共性问题(乱码问题、权限问题)

filter依赖于servlet容器,基于函数回调,过滤范围较大

interceptor依赖于框架容器,基于反射机制,只拦截请求    拦截器处理共性问题,减少代码的重复,便于维护

过滤器实例:在web.xml中配置

<filter>
<filter-name>demo</filter-name>
<filter-class>****</filter-class>
//filter启动时的初始参数
<init-param>
<param-name>demo</param-name>
<param-value>utf8</param-value>
</init-param>
<filter>
<filter-mapping>
<filter-name>demo</filter-name>
//匹配所有的请求
<url-pattern>*</url-pattern>
</filter-mapping>

拦截器:

实现拦截器步骤:

1.创建interceptor的包,创建IntecerptorDemo类,实现HandlerInterceptoe接口,重写方法。

//返回值:表示是否需要把当前请求拦截下来
//返回false请求被终止,返回true请求会继续运行
//参数Object代表被拦截的请求目标对象
1.public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler){
//请求之前被执行
return true;
}
2.public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3) throws Exception {
//渲染视图前被执行
//可以通过ModelAndView 参数来改变显示的视图,或者发往视图的方法
arg3.addObject("msg","拦截器想要返回的数据");    //会改变controller中ModelAndView 返回的数据
arg3.setViewName("/hello2.jsp");   //会改变controller中ModelAndView要显示的页面

}
3.public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
//请求结束后被执行

}


2.把拦截器注册到到springMvc中。

<mvc-interceptors>
<mvc-interceptor>
<mvc-mapping path="/*"/>              <!-- 如果不配置或/*,将拦截所有的Controller -->
<mvc-mapping path="/**"/>             <!-- /**是指所有文件夹及其子文件夹,/*指所有文件夹不含子文件夹 -->
<bean class=" 创建拦截器类的位置 "></bean>
</mvc-interceptor>               <!-- 联通盒子项目实例 <mvc:mapping path="/**"  /><mvc:mapping path="/**/*"  /><mvc:mapping path="/**/*/*" />  -->
</mvc-interceptors>


3.配置拦截器拦截的规则,不配置将拦截所有请求。

多个拦截器方法执行顺序:

多个拦截器都需要第二步注册到springmvc

preHandler1-->preHandler2-->controller-->postHandler2-->postHandler1-->afterCompletion2-->afterCompletion1

另一种实现拦截器的方法:

 实现webRequestIntercrptor   注册到springmvc写法不变    弊端: preHandler方法无返回值为void   不能终止请求  不常用

拦截器的使用场景:

原则:处理所有请求的共同问题

1.解决乱码问题

public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler){
//请求之前被执行
request.setCharacterEncding("utf-8");
return true;
}


2.解决权限验证问题

public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler){
//请求之前被执行
//用户是否登录判断
if(request.getSession().getAttribute("sessionName") == null){
//用户无会话,未登录,终止请求,发送到登录页面
request.getRequestDispatcher("login.jsp(或者是请求/login)").forward(request,response);
return false;
}
return true;
}


联通盒子拦截器实例:

getContextPath:         /test                                       得到当前应用的根目录

getRequestURI:         /test/test.jsp 
getRequestURL:        http://localhost:8080/test/test.jsp 

//不被拦截的请求
String[] noFilters = new String[]{
"login",  // 登录
"index",
"regist"
}

String uri = request.getRequestURI();
boolean beFilter = true;
for(String str : noFilters){
if(uri.indexOf(str) != -1){
return false
}
}
if(beFilter){
Object  userObject = request.getSession().getAttribute("sessionName");
if(userObject == null ){
request.getRequestDispatcher("/login").forward(request,response);
retuen false;
}
}
return true;


菜鸟求纠错补充。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc interceptor