Für die meisten Systeme ist eine Berechtigungsverwaltung erforderlich, um zu bestimmen, welche Inhalte verschiedene Benutzer sehen können. Wie implementiert man also die Berechtigungsüberprüfung in Spring MVC? Natürlich können wir dazu weiterhin den Filter Filter im Servlet verwenden. Aber mit Hilfe des Action Interceptors in Spring MVC können wir eine annotationsbasierte Berechtigungsüberprüfung implementieren.
SpringMVC Learning Series (9) Detaillierte Erläuterung des Codes zur Implementierung der annotationsbasierten Berechtigungsüberprüfung. Stellen Sie zunächst den Aktions-Interceptor vor:
HandlerInterceptor ist die von Spring MVC bereitgestellte Interceptor-Schnittstelle, mit der wir unsere eigene Verarbeitungslogik implementieren können:
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; }
Sie können sehen, dass die Schnittstelle über drei Methoden verfügt. Ihre Bedeutung ist wie folgt:
preHandle: Wird vor dem Ausführen der Verarbeitungslogik in der Aktion it ausgeführt Gibt boolean zurück. Wenn wir hier „true“ zurückgeben, führen wir weiterhin „postHandle“ aus, und „afterCompletion“, wenn wir „false“ zurückgeben, unterbrechen wir die Ausführung.
postHandle: Wird ausgeführt, bevor zur Ansicht zurückgekehrt wird, nachdem die Logik in der Aktion ausgeführt wurde.
afterCompletion: Wird ausgeführt, nachdem die Aktion zur Ansicht zurückgekehrt ist.
Der HandlerInterceptorAdapter ist die Standardimplementierung von HandlerInterceptor, um uns die Verwendung von HandlerInterceptor zu erleichtern. Die preHandle-Methode führt keine direkte Verarbeitung durch, sodass wir nur drei nachträglich implementieren müssen Beim Erben von HandlerInterceptorAdapter ist nur die von uns benötigte Methode erforderlich, im Gegensatz zum Erben von HandlerInterceptor, das unabhängig davon, ob drei Methoden benötigt werden, implementiert werden muss.
Natürlich können wir mit Hilfe von HandlerInterceptor viele andere Funktionen implementieren, wie z. B. Protokollierung, Analyse der Anforderungsbearbeitungszeit usw., und die Berechtigungsüberprüfung ist nur eine davon.
SpringMVC Learning Series (9) Detaillierte Erläuterung des Codes zur Implementierung der annotationsbasierten Berechtigungsüberprüfung. Lassen Sie uns die Funktion zur Überprüfung der Anmerkungsberechtigung Schritt für Schritt abschließen.
Fügen Sie zunächst einen Konto-Controller hinzu und melden Sie sich an. Aktion und Ansicht, um das Springen zur Anmeldeseite zu simulieren, wenn keine Berechtigung vorliegt. Der Inhalt ist wie folgt:
In den com.demo.web.controllers Paket 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"; } }
Login.jsp im Ansichtenordner anzeigen:
nbsp;html PUBLIC "-//W3C//DTD HTML 4.0SpringMVC Learning Series (9) Detaillierte Erläuterung des Codes zur Implementierung der annotationsbasierten Berechtigungsüberprüfung Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><meta><title>Insert title here</title> 这里是登录界面
Erstellen Sie ein neues Paket com.demo.web.auth und fügen Sie die benutzerdefinierte Annotation AuthPassport hinzu. Der Inhalt lautet wie folgt:
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; }
Fügen Sie Ihre eigene Interceptor-Implementierung hinzu, von der AuthInterceptor erbt HandlerInterceptorAdapter, der Inhalt lautet wie folgt:
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; } }
Fügen Sie den folgenden Inhalt zur springservlet-config.xml des Konfigurationsprojekts hinzu:
<interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean learning series detaillierte erl des codes zur implementierung der annotationsbasierten berechtigungs></bean> <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> <bean></bean></interceptors>
In diesem Auf diese Weise wird die AuthInterceptor-Verarbeitung aufgerufen, wenn jede Aktionsmethode ausgeführt wird. Wenn festgestellt wird, dass die Aktion über die von uns definierte AuthPassport-Annotation verfügt, wird die darin enthaltene Berechtigungsüberprüfungslogik ausgeführt.
Führen Sie das Projekt aus:
Sie können sehen, dass die Indexmethode von HelloworldController, die wir in springservlet-config.xml definiert haben, ausgeführt wird.
<!-- 如果当前请求为“/”时,则转发到“/helloworld/index" --><view-controller></view-controller>
下面我们在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上加上这个注解就可以实现权限控制功能了。
注解式权限验证的内容到此结束。
以上就是SpringMVC学习系列(9) 之 实现注解式权限验证的代码详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!