博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC学习系列(9) 之 实现注解式权限验证
阅读量:5874 次
发布时间:2019-06-19

本文共 4392 字,大约阅读时间需要 14 分钟。

hot3.png

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在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:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
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上加上这个注解就可以实现权限控制功能了。

 

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

 

代码下载:

转载于:https://my.oschina.net/secyaher/blog/274447

你可能感兴趣的文章
spring 线程安全
查看>>
面试十大难题的样板回答
查看>>
梦断代码读后感(一)
查看>>
1489 蜥蜴和地下室
查看>>
Linux服务-bind
查看>>
SpringMVC系列(十六)Spring MVC与Struts2的对比
查看>>
20061008: IntelliJ Idea 6
查看>>
Android IOS WebRTC 音视频开发总结(四一)-- QQ和webrtc打洞能力pk
查看>>
Immediately register your GHD frizzy hair straightener concerning the GHD web page
查看>>
清除Xcode缓存
查看>>
Sharepoint2013:在页面上显示错误信息
查看>>
8-2测试总结
查看>>
SQLiteDatabase中query、insert、update、delete方法参数说明
查看>>
将军令
查看>>
多线程实现端口扫描
查看>>
java 类的应用
查看>>
koa cookie使用
查看>>
shutdown immediate ,无法关闭数据库的解决方案
查看>>
CentOS7系统上的GPSTK源码安装
查看>>
三种样式表
查看>>