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

SpringMVC拦截器的使用

2015-04-28 08:59 387 查看
SpringMVC能用拦截器对请求进行拦截。下面介绍拦截器的简单使用。

一、拦截器的配置

1.传统的配置

<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" >
<property name="interceptors">
<!-- 多个拦截器,顺序执行 -->
<list>
<ref bean="commonInterceptor"/>
</list>
</property>
</bean>
<!--
如果不定义mappingURL,则默认拦截所有对Controller的请求 ;
可以使用正则表达式对url进行匹配,从而更细粒度的进行拦截(.*/entryOrJsonController\.do\?action=reg.*);
-->
<bean id="commonInterceptor" class="com.wy.interceptor.CommonInterceptor">
<property name="mappingURL" value=".*/entryOrJsonController\.do\?action=reg.*"/>
</bean>


2、基于注解的配置

<!-- 拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,将拦截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
二、拦截器类

package com.wy.interceptor;

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

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class CommonInterceptor implements HandlerInterceptor {

private Logger log = Logger.getLogger(CommonInterceptor.class);

public CommonInterceptor() {
// TODO Auto-generated constructor stub
}

private String mappingURL;//利用正则映射到需要拦截的路径
public void setMappingURL(String mappingURL) {
this.mappingURL = mappingURL;
}

/**
* 在业务处理器处理请求之前被调用
* 如果返回false
*     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
*
* 如果返回true
*    执行下一个拦截器,直到所有的拦截器都执行完毕
*    再执行被拦截的Controller
*    然后进入拦截器链,
*    从最后一个拦截器往回执行所有的postHandle()
*    接着再从最后一个拦截器往回执行所有的afterCompletion()
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
log.info("==============执行顺序: 1、preHandle================");
String url=request.getRequestURL().toString();
if(mappingURL==null || url.matches(mappingURL)){
request.getRequestDispatcher("/msg.jsp").forward(request, response);
return false;
}
return true;
}

//在业务处理器处理请求执行完成后,生成视图之前执行的动作
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
log.info("==============执行顺序: 2、postHandle================");
}

/**
* 在DispatcherServlet完全处理完请求后被调用
*
*   当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
log.info("==============执行顺序: 3、afterCompletion================");
}

}


preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,
或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

三、应用实例
我们做微信项目的时候要进行授权,获得目前登陆用户。授权要进行要经过拦截器。而且并不是所有的功能都要经过拦截器,如果拦截器能拦截所有的请求一些功能就出错。所以我们在注解方面下手,解决了问题。

1.拦截器配置

<!-- OAuth2拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!--
对所有的请求拦截使用/** ,对某个模块下的请求拦截使用:/myPath/*
-->
<mvc:mapping path="/admin/*" />

<!--			<mvc:mapping path="/com.tgb.weixin.controller.OAuth2Controller.UserSalaryInfoController" />-->

<bean id="oauth2Interceptor" class="com.tgb.weixin.interceptor.OAuth2Interceptor" />
</mvc:interceptor>
</mvc:interceptors>
如果<mvc:mapping path="/admin/*" />的配置改为<mvc:mapping path="/**" />是对所有请求的拦截,如果在前面加上一级,就对特定的请求拦截。所以执行到哪个方法要进行验证就在方法的注解前加一级。

2.方法实例

/*
* 设置权限
*/
@OAuthRequired
@RequestMapping("/admin/SetPermission.do")
public void SetPermission(HttpServletRequest request,HttpServletResponse response,Model model){
//	public void SetPermission(HttpServletRequest request,HttpServletResponse response){
//综合部ID
String deptId="90";
//获取需要排除的用户ID
String strUserId=request.getParameter("idstr");

//获取当前用户ID
//		String userId="zhisheng";
HttpSession session = request.getSession();
model.addAttribute("Userid", session.getAttribute("UserId"));
System.out.println("用户UserId="+session.getAttribute("UserId"));
String userId=session.getAttribute("UserId").toString(); // 从Session中获取登录的用户Id
//将用户保存至数据库
try {
Boolean isFlag=	addressListService.AddTalkingUser(strUserId,deptId,userId);
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


四、总结

这样能在controller的方法上为所欲为,不同的方法注解经过不同的拦截器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: