赞
踩
一.首先介绍一下action拦截器:
HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下:
public interfaceHandlerInterceptor {booleanpreHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler)throwsException;voidpostHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)throwsException;voidafterCompletion(
HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex)throwsException;
}
可以看到接口有3个方法,其含义如下:
preHandle:在执行action里面的处理逻辑之前执行,它返回的是boolean,这里如果我们返回true在接着执行postHandle和afterCompletion,如果我们返回false则中断执行。
postHandle:在执行action里面的逻辑后返回视图之前执行。
afterCompletion:在action返回视图后执行。
HandlerInterceptorAdapter适配器是Spring MVC为了方便我们使用HandlerInterceptor而对HandlerInterceptor 的默认实现,里面的3个方法没有做任何处理,在preHandle方法直接返回true,这样我们继承 HandlerInterceptorAdapter后只需要实现3个方法中我们需要的方法即可,而不像继承HandlerInterceptor一样不 管是否需要3个方法都要实现。
当然借助于HandlerInterceptor我们可以实现很多其它功能,比如日志记录、请求处理时间分析等,权限验证只是其中之一。
二.下面我们就来一步一步来完成注解式权限验证的功能。
首先添加一个账户的Controller和登录的Action及视图来模拟在没有权限时跳转到登陆页面,内容分别如下:
com.demo.web.controllers包中的AccountController.java:
packagecom.demo.web.controllers;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value= "/account")public classAccountController {
@RequestMapping(value="/login", method ={RequestMethod.GET})publicString login(){return "login";
}
}
views文件夹下的视图login.jsp:
Insert title here新建包com.demo.web.auth,添加自定义注解AuthPassport,内容如下:
packagecom.demo.web.auth;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Inherited;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;
@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)public @interfaceAuthPassport {boolean validate() default true;
}
添加自己的拦截器实现AuthInterceptor继承于HandlerInterceptorAdapter,内容如下:
packagecom.demo.web.auth;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class AuthInterceptor extendsHandlerInterceptorAdapter {
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
AuthPassport authPassport= ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);//没有声明需要权限,或者声明不验证权限
if(authPassport == null || authPassport.validate() == false)return true;else{//在这里实现自己的权限验证逻辑
if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理)
return true;else//如果验证失败
{//返回到登录界面
response.sendRedirect("account/login");return false;
}
}
}else
return true;
}
}
配置项目的springservlet-config.xml添加如下内容:
这样在执行每个action方法是都会调用AuthInterceptor处理,当判断action上有我们定义AuthPassport注解时就会执行里面的权限验证逻辑。
运行项目:
可以看到执行了我们在springservlet-config.xml定义的HelloworldController的index方法。
下面我们在HelloworldController的index方法上加上自定义注解AuthPassport:
@AuthPassport
@RequestMapping(value={"/index","/hello"})publicModelAndView index(){
ModelAndView modelAndView= newModelAndView();
modelAndView.addObject("message", "Hello World!");
modelAndView.setViewName("index");returnmodelAndView;
}
重新运行项目:
可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。
注解式权限验证的内容到此结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。