SpringMVC實現(xiàn)注解式權限驗證的實例
對大部分系統(tǒng)來說都需要權限管理來決定不同用戶可以看到哪些內容,那么如何在Spring MVC中實現(xiàn)權限驗證呢?當然我們可以繼續(xù)使用servlet中的過濾器Filter來實現(xiàn)。但借助于Spring MVC中的action攔截器我們可以實現(xiàn)注解式的權限驗證。
一.首先介紹一下action攔截器:
HandlerInterceptor是Spring MVC為我們提供的攔截器接口,來讓我們實現(xiàn)自己的處理邏輯,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:在執(zhí)行action里面的處理邏輯之前執(zhí)行,它返回的是boolean,這里如果我們返回true在接著執(zhí)行postHandle和afterCompletion,如果我們返回false則中斷執(zhí)行。
postHandle:在執(zhí)行action里面的邏輯后返回視圖之前執(zhí)行。
afterCompletion:在action返回視圖后執(zhí)行。
HandlerInterceptorAdapter適配器是Spring MVC為了方便我們使用HandlerInterceptor而對HandlerInterceptor 的默認實現(xiàn),里面的3個方法沒有做任何處理,在preHandle方法直接返回true,這樣我們繼承HandlerInterceptorAdapter后只需要實現(xiàn)3個方法中我們需要的方法即可,而不像繼承HandlerInterceptor一樣不管是否需要3個方法都要實現(xiàn)。
當然借助于HandlerInterceptor我們可以實現(xiàn)很多其它功能,比如日志記錄、請求處理時間分析等,權限驗證只是其中之一。
二.下面我們就來一步一步來完成注解式權限驗證的功能。
首先添加一個賬戶的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;
}
添加自己的攔截器實現(xiàn)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{
//在這里實現(xiàn)自己的權限驗證邏輯
if(false)//如果驗證成功返回true(這里直接寫false來模擬驗證失敗的處理)
return true;
else//如果驗證失敗
{
//返回到登錄界面
response.sendRedirect("account/login");
return false;
}
}
}
else
return true;
}
}
配置項目的springservlet-config.xml添加如下內容:
<mvc:interceptors> <!-- 國際化操作攔截器 如果采用基于(請求/Session/Cookie)則必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <!-- 如果不定義 mvc:mapping path 將攔截所有的URL請求 --> <bean class="com.demo.web.auth.AuthInterceptor"></bean> </mvc:interceptors>
這樣在執(zhí)行每個action方法是都會調用AuthInterceptor處理,當判斷action上有我們定義AuthPassport注解時就會執(zhí)行里面的權限驗證邏輯。
運行項目:

可以看到執(zhí)行了我們在springservlet-config.xml定義的HelloworldController的index方法。
<!-- 如果當前請求為“/”時,則轉發(fā)到“/helloworld/index" --> <mvc:view-controller path="/" view-name="forward:/helloworld/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;
}
重新運行項目:

可以看到正確執(zhí)行了權限判斷邏輯,這樣我們只需要在我們在需要權限驗證的action上加上這個注解就可以實現(xiàn)權限控制功能了。
注解式權限驗證的內容到此結束。
代碼下載:demo
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringMVC項目訪問controller時候報404的解決
這篇文章主要介紹了SpringMVC項目訪問controller時候報404的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot實戰(zhàn):Spring如何找到對應轉換器優(yōu)雅使用枚舉參數(shù)
這篇文章主要介紹了SpringBoot實戰(zhàn)中Spring是如何找到對應轉換器優(yōu)雅的使用枚舉參數(shù),文中附有詳細的實例代碼有需要的朋友可以參考下,希望可以有所幫助2021-08-08
java中synchronized Lock(本地同步)鎖的8種情況
本文主要介紹了java中synchronized Lock(本地同步)鎖的8種情況,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
詳解Java8新特性之interface中的static方法和default方法
這篇文章主要介紹了Java8新特性之interface中的static方法和default方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
Springboot讀取templates文件html代碼實例
這篇文章主要介紹了Springboot讀取templates文件html代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

