最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC實現(xiàn)注解式權(quán)限驗證的實例

 更新時間:2017年02月06日 15:49:04   作者:Erola  
本篇文章主要介紹了SpringMVC實現(xiàn)注解式權(quán)限驗證的實例,可以使用Spring MVC中的action攔截器來實現(xiàn),具有一定的參考價值,有興趣的可以了解下。

對大部分系統(tǒng)來說都需要權(quán)限管理來決定不同用戶可以看到哪些內(nèi)容,那么如何在Spring MVC中實現(xiàn)權(quán)限驗證呢?當(dāng)然我們可以繼續(xù)使用servlet中的過濾器Filter來實現(xiàn)。但借助于Spring MVC中的action攔截器我們可以實現(xiàn)注解式的權(quán)限驗證。

一.首先介紹一下action攔截器:

HandlerInterceptor是Spring MVC為我們提供的攔截器接口,來讓我們實現(xiàn)自己的處理邏輯,HandlerInterceptor 的內(nèi)容如下:

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 的默認(rèn)實現(xiàn),里面的3個方法沒有做任何處理,在preHandle方法直接返回true,這樣我們繼承HandlerInterceptorAdapter后只需要實現(xiàn)3個方法中我們需要的方法即可,而不像繼承HandlerInterceptor一樣不管是否需要3個方法都要實現(xiàn)。

當(dāng)然借助于HandlerInterceptor我們可以實現(xiàn)很多其它功能,比如日志記錄、請求處理時間分析等,權(quán)限驗證只是其中之一。

 二.下面我們就來一步一步來完成注解式權(quán)限驗證的功能。

首先添加一個賬戶的Controller和登錄的Action及視圖來模擬在沒有權(quán)限時跳轉(zhuǎn)到登陸頁面,內(nèi)容分別如下:

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,內(nèi)容如下:

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,內(nèi)容如下:

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);
   
   //沒有聲明需要權(quán)限,或者聲明不驗證權(quán)限
    if(authPassport == null || authPassport.validate() == false)
    return true;
   else{    
    //在這里實現(xiàn)自己的權(quán)限驗證邏輯
    if(false)//如果驗證成功返回true(這里直接寫false來模擬驗證失敗的處理)
     return true;
    else//如果驗證失敗
    {
     //返回到登錄界面
     response.sendRedirect("account/login");
     return false;
    }  
   }
  }
  else
   return true; 
  }
}

配置項目的springservlet-config.xml添加如下內(nèi)容:

<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方法是都會調(diào)用AuthInterceptor處理,當(dāng)判斷action上有我們定義AuthPassport注解時就會執(zhí)行里面的權(quán)限驗證邏輯。

運(yùn)行項目:

可以看到執(zhí)行了我們在springservlet-config.xml定義的HelloworldController的index方法。

<!-- 如果當(dāng)前請求為“/”時,則轉(zhuǎn)發(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;
}

重新運(yùn)行項目:

可以看到正確執(zhí)行了權(quán)限判斷邏輯,這樣我們只需要在我們在需要權(quán)限驗證的action上加上這個注解就可以實現(xiàn)權(quán)限控制功能了。

注解式權(quán)限驗證的內(nèi)容到此結(jié)束。 

代碼下載:demo

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 容器環(huán)境的JVM內(nèi)存設(shè)置實踐記錄

    容器環(huán)境的JVM內(nèi)存設(shè)置實踐記錄

    Docker和K8S的興起,很多服務(wù)已經(jīng)運(yùn)行在容器環(huán)境,對于java程序,JVM設(shè)置是一個重要的環(huán)節(jié),這里總結(jié)下我們項目里的最佳實踐,對容器環(huán)境的JVM內(nèi)存相關(guān)知識感興趣的朋友一起看看吧
    2022-03-03
  • Java多線程編程中線程鎖與讀寫鎖的使用示例

    Java多線程編程中線程鎖與讀寫鎖的使用示例

    這篇文章主要介紹了Java多線程編程中線程鎖與讀寫鎖的使用示例,鎖是控制程序多線程并發(fā)的重要手段,需要的朋友可以參考下
    2016-04-04
  • Java線程池隊列LinkedTransferQueue示例詳解

    Java線程池隊列LinkedTransferQueue示例詳解

    這篇文章主要為大家介紹了Java線程池隊列LinkedTransferQueue示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Spring Boot的listener(監(jiān)聽器)簡單使用實例詳解

    Spring Boot的listener(監(jiān)聽器)簡單使用實例詳解

    監(jiān)聽器(Listener)的注冊方法和 Servlet 一樣,有兩種方式:代碼注冊或者注解注冊。接下來通過本文給大家介紹Spring Boot的listener(監(jiān)聽器)簡單使用,需要的朋友可以參考下
    2017-04-04
  • Java實現(xiàn)駝峰、下劃線互轉(zhuǎn)的方法

    Java實現(xiàn)駝峰、下劃線互轉(zhuǎn)的方法

    這篇文章主要介紹了Java實現(xiàn)駝峰、下劃線互轉(zhuǎn)的示例代碼,主要有使用 Guava 實現(xiàn)和自定義代碼轉(zhuǎn),本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • java中Servlet監(jiān)聽器的工作原理及示例詳解

    java中Servlet監(jiān)聽器的工作原理及示例詳解

    這篇文章主要介紹了java中Servlet監(jiān)聽器的工作原理及示例詳解。Servlet監(jiān)聽器用于監(jiān)聽一些重要事件的發(fā)生,監(jiān)聽器對象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。感興趣的可以來了解一下
    2020-07-07
  • Maven項目修改JDK版本全過程

    Maven項目修改JDK版本全過程

    這篇文章主要介紹了Maven項目修改JDK版本全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java版水果管理系統(tǒng)源碼

    Java版水果管理系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了Java版水果管理系統(tǒng)源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot配置開發(fā)環(huán)境的詳細(xì)步驟(JDK、Maven、IDEA等)

    SpringBoot配置開發(fā)環(huán)境的詳細(xì)步驟(JDK、Maven、IDEA等)

    文章介紹了如何配置SpringBoot開發(fā)環(huán)境,包括安裝JDK、Maven和IDEA,并提供了詳細(xì)的步驟和配置方法,感興趣的朋友一起看看吧
    2024-12-12
  • java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享

    java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享

    這篇文章主要介紹了java實現(xiàn)根據(jù)ip地址獲取地理位置的代碼分享,本文中使用的是QQ在線接口,也可以使用新浪、淘寶等提供的在線接口,需要的朋友可以參考下
    2014-08-08

最新評論

门源| 金乡县| 绥德县| 华坪县| 淮北市| 绥棱县| 景宁| 大关县| 陵川县| 盐边县| 顺平县| 松潘县| 铁岭市| 万山特区| 广饶县| 铜梁县| 永嘉县| 广南县| 理塘县| 会泽县| 祁阳县| 拜城县| 新巴尔虎左旗| 临夏市| 双城市| 西乌珠穆沁旗| 金门县| 泸定县| 增城市| 五华县| 雅安市| 德昌县| 醴陵市| 七台河市| 垣曲县| 涞水县| 合阳县| 清丰县| 云梦县| 交口县| 方山县|