微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringMVC实现注解式权限验证的实例

本篇文章主要介绍了SpringMVC实现注解式权限验证的实例,可以使用Spring MVC中的action拦截器来实现,具有一定的参考价值,有兴趣的可以了解下。

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现。但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证。

一.首先介绍一下action拦截器:

handlerinterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,handlerinterceptor内容如下:

public interface handlerinterceptor { boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }

可以看到接口有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:

package com.demo.web.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value = "/account") public class AccountController { @RequestMapping(value="/login", method = {RequestMethod.GET}) public String login(){ return "login"; } }

views文件夹下的视图login.jsp:

Insert title here 这里是登录界面

新建包com.demo.web.auth,添加自定义注解AuthPassport,内容如下:

package com.demo.web.auth; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Inherited @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AuthPassport { boolean validate() default true; }

添加自己的拦截器实现AuthInterceptor继承于handlerinterceptorAdapter,内容如下:

package com.demo.web.auth; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.handlerinterceptorAdapter; public class AuthInterceptor extends handlerinterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 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"}) public ModelAndView index(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addobject("message", "Hello World!"); modelAndView.setViewName("index"); return modelAndView; }

重新运行项目:

可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。

注解式权限验证的内容到此结束。 

代码下载:demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐