SpringMVC拦截器

一: 在springmvc配置文件
<mvc:interceptors>
!--定义全局拦截器-->
<bean class="cn.yunhe.controller.Intertype"/>

<!--定义排除在外的拦截器方法-->
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<mvc:exclude-mapping path="/user/get"/> //排除在外的
<bean class="cn.yunhe.controller.SessionContrller"/>
</mvc:interceptor>

</mvc:interceptors>


1.创建枚举定义全局错误带代码

public enum Errcode {


Gl_SYS_BUSY("001","系统繁忙"),
Gl_SYS_NULL("101","空指针"),
Gl_SYS_FORMAT_ERR("102","数字格式化异常"),
Gl_SYS_ARG_INVALID("103","请求参数校验不通过"),
USER_AUTH_ERR("103","用户密码不正确"),
NO_SESSION("104","会话不存在");

 

public String code;
public String msg;

private Errcode(String code,String msg){
this.code=code;
this.msg=msg;
}


}


2.自定义一个异常

public class ServiceExcption extends RuntimeException{

private static final long serialVersionUID = 1L;

private Errcode err;
public ServiceExcption (Errcode err){
this.err=err;
}

public Errcode getErr() {
return err;
}

public void setErr(Errcode err) {
this.err = err;
}

 

3.在定义一个全局异常处理类,用于异常后的拦截

@RestControllerAdvice
public class GlobaGlobalExceptionHandler {

//log4j
private Logger logger = LogManager.getLogger
(GlobaGlobalExceptionHandler.class);

//总异常
@ExceptionHandler(Exception.class)
public ResultModel<?> hanleException(Exception ex){
logger.info("异常繁忙");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_BUSY.code);
rm.setMsg(Errcode.Gl_SYS_BUSY.msg);
logger.error(ex.getMessage());
return rm;

}


@ExceptionHandler(NullPointerException.class)
public ResultModel<?> hanleException1() {
logger.info("空指针异常");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_NULL.code);
rm.setMsg(Errcode.Gl_SYS_NULL.msg);
return rm;
}


@ExceptionHandler(NumberFormatException.class)
public ResultModel<?> hanleException2() {
logger.info("数字格式化异常");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_FORMAT_ERR.code);
rm.setMsg(Errcode.Gl_SYS_FORMAT_ERR.msg);
return rm;
}


@ExceptionHandler(MissingServletRequestParameterException.class)
public ResultModel<?> hanleException3() {
logger.info("请求参数校验不通过");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_ARG_INVALID.code);
rm.setMsg(Errcode.Gl_SYS_ARG_INVALID.msg);
return rm;
}


@ExceptionHandler(ServiceExcption.class)
public ResultModel<?> hanleException4(ServiceExcption se) {
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(se.getErr().code);
rm.setMsg(se.getErr().msg);
return rm;
}


4.创建拦截器

public class SessionContrller implements HandlerInterceptor{

private Logger logger = LogManager.getLogger(SessionContrller.class);

public boolean preHandle(HttpServletRequest request, HttpServletResponse
httpServletResponse, Object o) throws Exception {

logger.debug("开始执行回话!!!!");

//判断是否进行了登陆

if (request.getSession() == null || request.getSession().getAttribute
("userid") == null) {
logger.debug("验证有异常啦");
//response.sendRedirect(location);
throw new ServiceExcption(Errcode.NO_SESSION);
}

return true;

}

public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)
throws Exception {

logger.debug("第二次来时回话");

}

public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.debug("第三次回话");
}
}


二.其他方法中可以进行判断进行抛出异常

例如:

/**
* 删除指定订单
* @param orderid
* @return
*/
@RequestMapping(value = "/{orderid}",method = RequestMethod.DELETE)
public ResultModel<?> delOrder(@PathVariable String orderid) {

logger.debug("orderid"+orderid);

//通过跑出自定义异常,来进行操作
if (orderid.equals("200")){
throw new ServiceExcption(Errcode.Gl_SYS_ARG_INVALID);
}


System.out.println("这里是订单删除,订单id是"+orderid);
ResultModel<Void> rm = new ResultModel<Void>();
// TODO:去调用服务层代码,到数据库删除订单
return rm;
}

posted @ 2017-07-27 15:14  l小样  阅读(168)  评论(0编辑  收藏  举报