当前位置:   article > 正文

java springmvc权限校验_SpringMVC 实现注解式权限验证 1

springmvc 鉴权

一.首先介绍一下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注解时就会执行里面的权限验证逻辑。

运行项目:

480cb3d3881f15b803a33467f4131dd0.png

可以看到执行了我们在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;

}

重新运行项目:

7119734df032fc0028fc957a15031bbb.png

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

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/182379
推荐阅读
相关标签
  

闽ICP备14008679号