SpringMVC完成注解式權限驗證的實例。本站提示廣大學習愛好者:(SpringMVC完成注解式權限驗證的實例)文章只能為提供參考,不一定能成為您想要的結果。以下是SpringMVC完成注解式權限驗證的實例正文
對大局部零碎來說都需求權限管理來決議不同用戶可以看到哪些內容,那麼如何在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;
}
}
配置項目的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>
這樣在執行每個action辦法是都會調用AuthInterceptor處置,當判別action上有我們定義AuthPassport注解時就會執行外面的權限驗證邏輯。
運轉項目:

可以看到執行了我們在springservlet-config.xml定義的HelloworldController的index辦法。
<!-- 假如以後懇求為“/”時,則轉發到“/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;
}
重新運轉項目:

可以看到正確執行了權限判別邏輯,這樣我們只需求在我們在需求權限驗證的action上加上這個注解就可以完成權限控制功用了。
注解式權限驗證的內容到此完畢。
代碼下載:demo
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。