大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > SpringMVC实现注解式权限验证

SpringMVC实现注解式权限验证(1)

关键词:SpringMVC注解式权限验证  阅读(4362) 赞(10)

[摘要]本文是对SpringMVC实现注解式权限验证的讲解,对学习Java编程技术有所帮助,与大家分享。

对大局部零碎来说都需求权限管理来决议不同用户可以看到哪些内容,那么如何在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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    这里是登录界面
</body>
</html>

新建包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;   
     }
}
«上一页12下一页»


相关评论