Es gibt viele Möglichkeiten, eine funktionale Berechtigungsüberprüfung zu implementieren. Einer besteht darin, einen Interceptor für Abfanganforderungen zu verwenden, und das andere ist, AOP zu verwenden, um Ausnahmen zu werfen.
Verwenden Sie zunächst einen Interceptor, um die Funktion des Springens zur Anmeldeschnittstelle zu erkennen, wenn er nicht angemeldet ist. Beachten Sie, dass AOP hier nicht verwendet wird, aber Interceptors werden abgefangen, da AOP im Allgemeinen in die Service -Layer -Methode eintritt, und der Interceptor die Anforderung aus der Controller -Ebene abfängt. Es ist auch ein Prozessor selbst, der die Übergabe der Anfrage direkt unterbrechen und die Ansicht zurückgeben kann, während AOP nicht kann.
1. Verwenden Sie den Interceptor, um die Funktion des Springens zur Anmeldeschnittstelle zu erkennen, wenn er nicht in Anmeldung eingelogt ist
1.1 Interceptor SecurityInterceptor
Paket com.jykj.demo.filter; import java.io.printwriter; import Javax.servlet.http.httpServletRequest; import Javax.servlet.http.httpServletresponse; Import Javax.servlet.http.http. javax.servlet.http.httpSession; import org.springframework com.jykj.demo.util.result; public class SecurityInterceptor implementiert HandlerInterceptor {@Override public boolean prehandle (httpServletRequest -Anforderung, httpServletResponde -Antwort, Objekt Handler) löst Ausnahme aus { System.out.println ("SecurityInterceptor:"+request.getContextPath ()+","+request.getRequesturi ()+","+request.getMethod ()); HttpSession Session = Request.GetSession (); if (session.getAttribute (helper.session_user) == null) {system.out.println ("AutorisierungException: nicht angemeldet!" +request.getMethod ()); if ("post" .equalSignoreCase (request.getMethod ()) {response.setContentType ("text/html; charSet = utf-8"); Printwriter out = response.getWriter (); out.write (json.tojonstring (neues Ergebnis (falsch, nicht angemeldet! "))); out.flush (); out.close (); } else {response.sendredirect (request.getContextPath ()+"/login"); } return false; } else {return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // Todo automatisch generierte Methode Stub}}1.2.spring-mvc.xml (Interceptor-Konfigurationsteil)
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <mvc:resources mapping="/resources/**" location="/resources/" /><mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- Intercept requests for single-layer structures such as /test /login --> <mvc:mapping path="/**/*.aspx"/><!-- Intercept requests with suffix .aspx --> <mvc:mapping path="/**/*.do"/><!-- Intercept requests with suffix .do --> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/signIn"/> <MVC: Ausschließen-Mapping Path = "/register"/> <bean> </bean> </mvc: interceptor> </mvc: interceptors>Hier muss angeben: Der vom Interceptor abgefangene Pfad hat vorzugsweise einen Suffixnamen, ansonsten sind einige statische Ressourcendateien schwer zu steuern, dh die Anforderung sollte ein einheitliches Format wie .do usw. haben, so dass die Übereinstimmung und die Filtergeschwindigkeit sehr schnell sind. Wenn dies nicht der Fall ist, wird beispielsweise die Geschwindigkeit der Seite mit der Rendite der Seite sehr langsam, da die Ressourcendatei auch abgefangen wird, um alle Anforderungen abzufangen.
2. Verwenden Sie AOP, um eine funktionale Berechtigungsüberprüfung zu implementieren
Die Überprüfung der Funktionsberechtigung kann auch mit einem Interceptor ähnlich implementiert werden, wird jedoch alle Anforderungen abfangen und keine gute Filterfunktion für Anfragen haben, für die keine Berechtigungsüberprüfung erforderlich ist. Daher wird es mit AOP implementiert, um die Methode zur Abnahme der erforderlichen Überprüfung anzugeben.
2.1 Erlaubnisaspekt
Paket com.jykj.demo.filter; import java.io.ioxception; import Java.lang.reflect.method; import org. com.jykj.demo.annotation * Wenn keine Erlaubnis vorliegt, wird eine AccessDdenEdException -Ausnahme ausgelöst, die die Anfrage an einen Controller weiterleitet und dann das Ausnahmeergebnis zurückgibt. public void dobefore (joinpoint jp) löst IOException {System.out.println ("Log Permissionaspep vor Methode:" + JP.GettTarget (). getClass (). getName () + " + JP.GetSignature (). getClass ()) aus. Methode sorryMethod = getourcemethod (jp); if (sorucemethod! if (oper! = null) {int fidx = opera.idx (); Object [] args = jp.getargs (); if (fidx> = 0 && fidx <args.length) {int functionId = (Integer) args [fidx]; String rs = sysuserrolePermService.PermissionValidat (FunktionID); System.out.println ("PermissionValidat:"+rs); if (rs.trim (). isEmpty ()) {return; // normal}}}} Wirf eine neue AccessDdenEDException ("Sie haben keine Erlaubnis zum Betrieb!"); } private Methode GetOrcemethod (joinpoint jp) {method proxymethod = ((methodesignature) jp.getSignature ()). getMethod (); try {return jp.gettarget (). getClass (). getMethod (proxymethod.getName (), proxymethod.getParameterTypes ()); } catch (NoSuchMethodException e) {e.printstacktrace (); } catch (SecurityException e) {e.printstacktrace (); } return null; }}2.2 Annotationspalidienvermittlung
Paket com.jykj.demo.Annotation; import Java.lang.annotation Annotation vom Typ Tag. Die durch diese Annotation kommetierte Methode erfordert Berechtigungsüberprüfung* /@target (value = elementtype.method) @retention (value = retentionPolicy.Runtime) @DocumentedPublic @Interface ValidatePermission { /*** @Description Die Parameter -Indexposition. ausgeführt */ int idx () Standard 0;}HINWEIS: AOP unterteilt eine Methode, keine Anforderung eines Controllers. Daher kann sie nicht direkt zur Ansicht zurückkehren, um die Anforderung der Methode zu unterbrechen, sondern der Zweck, die Ausführung der Methode zu unterbrechen, kann erreicht werden, indem Ausnahmen ausgenommen werden. Wenn Sie in der vorabbenachrichtigen Benachrichtigung direkt die Verbindungspunktmethode zurückgeben, wird durch Überprüfung zurückgegeben. Andernfalls wird eine benutzerdefinierte AusnahmezugriffszugriffsDenneDexception die Ausführung der Verbindungspunktmethode unterbrechen. Die Erfassung der Ausnahme kann über den Ausnahmehandler des Systems (der als Controller angesehen werden kann) erfasst und auf eine Ansicht oder eine Anfrage umgeleitet werden). Dies erreicht den Zweck, die Anfrage abzufangen. Daher muss ein Ausnahmeprozessor konfiguriert werden.
2.3 Spring-MVC.xml (Ausnahmebereich und AOP-Konfiguration)
<bean> <!-- <property name="defaultErrorView" value="rediret:/error"></property> --> <property name="exceptionMappings"> <props> <!--<prop key="com.jykj.demo.exception.AuthorizationException">redirect:/login</prop>--> <prop key="com.jykj.demo.exception.AccessDeniedException">forward:/accessDenied</prop> </props> </property> </bean><bean id="aspectPermission" /> <!-- Perform function permission verification on all methods of the controller package and its subpackage with @ValidatePermission and ResponseBody annotations--> <aop:config proxy-target-class="true"> <AOP: Aspekt ref = "AspektPermission"> <AOP: pointcut id = "pc" Expression = " @Annotation (com.jykj.demo.Annotation <AOP: vor pointcut-ref = "pc" methode = "doBefore"/> </aoP: Aspekt> </aop: config>
2.4 Annotation von Controller -Anforderungen, die eine funktionale Überprüfung erfordern
@RequestMapping (value = "/moduleAccess.do", method = requestMethod.post, procies = "text/html; charset = utf-8") @RespondeBody @ValidatePermission public String moduleAccess (Int FID, String Action, FRMMODUME MODUL) {Outs.Out.OUT.Println (“FIDRintln (" Fid. int rs = -1; try {if (helper.f_action_create.equals (action)) {rs = moduleservice.access (modul, helper.db_action_insert); //module.setmoduleid(rs); modul = moduleservice.SelectByprimaryKey (RS); } else if (helper.f_action_edit.equals (action)) {rs = moduleservice.access (modul, Helper.db_action_update); modul = moduleservice.selectByprimaryKey (modul.getModulId ()); } else if (helper.f_action_remove.equals (action)) {rs = moduleservice.access (modul, Helper.db_action_delete); } else {return json.tojonstring (neues Ergebnis (Falsch, "Anfrage Parameter -Fehler: Aktion")); }} catch (Ausnahme e) {e.printstacktrace (); return JSON.TOJSONSTRING (neues Ergebnis (Falsch, "Die Operation ist fehlgeschlagen, eine Ausnahme, bitte wenden Sie sich an den Administrator!")); } if (rs <0) {return json.tojonstring (neues Ergebnis (Falsch, "Die Operation ist fehlgeschlagen, bitte wenden Sie sich an den Administrator!")); } return json.tojonstring (neues Ergebnis (True, Modul)); }2.5 Die Controller -Anfrage vorwärts:/accessDenied durch den Ausnahmehandler vorwärts:/accessDeniedie
@RequestMapping (value = "/AccessDenied", produziert = "text/html; charset = utf-8")@responseBodypublic String AccessDenied () {return json.tojonstring (neues Ergebnis (falsch, "Sie haben keine Berechtigung, dies zu operieren!");};};};};2.6 Wenn die Anforderungsüberprüfung fehlschlägt, gibt der obige Controller das Ergebnis selbst zurück.
Wie unten gezeigt:
{"Info": "Sie haben keine Erlaubnis, dies zu operieren!", "Erfolg": Falsch}
2.7 Beispiel für Funktionsprüfungsdienst
/ *** Überprüfen Sie die Berechtigung des aktuellen Benutzers in einer bestimmten Funktion eines Moduls* @param functionID* @return eine leere Zeichenfolge Zeigt die Berechtigung an, andernfalls handelt es sich um eine Fehlermeldung. // if (o == null) werfen neue autorisierungsexception (); Sysuser loginuser = (sysuser) o; if (loginuser.getUserid () == 1) return ""; try {return mapPer.PermissionValidat (loginuser.getUerId (), functionId); } catch (Ausnahme ex) {ex.printstacktrace (); Rückgabe "Ausnahme ist im Datenbankbetrieb aufgetreten!"; }} HINWEIS: Hier schneiden wir nur alle Methoden des Controller -Pakets und dessen Unterpackung mit @ValidatePermission und @ResponseBody Annotations ein. Dies ist definitiv nicht universell genug. Wir sollten die Methode mit @ValidatePermission einschneiden. In der Abschnittsklasse werden wir unterschiedliche Ausnahmen machen, indem wir beurteilen, ob die Methode @ResponseBody Annotations hat. Wenn die obige Ausnahme ausgelöst wird, wird die obige Ausnahme ausgelöst und in die JSON -String zurückgegeben.
Andernfalls sollte eine weitere benutzerdefinierte Ausnahme ausgelöst werden und die Anfrage in eine rechtliche Ansicht wie error.jsp weitergeleitet wird.
Send /moduleAccess.do Anfrage über den Kunden. Die entsprechende Methode der Anforderung hat sowohl @ValidatePermission als auch @ResponseBody und die FID der Funktions -ID -Parameter, sodass AOP die Methode eingeben kann, die DOBefore -Benachrichtigung ausführen und mit dem Funktionsparameter FID in Kombination mit der Benutzer -ID überprüft werden kann. Wenn die Überprüfung bestanden wird, wird das Programm es weiterhin ausführen. Andernfalls wird eine benutzerdefinierte AccessDdenEDException ausnahmsweise ausgeworfen. Die Ausnahme wird vom System erfasst (der Ausnahmebehandler muss konfiguriert werden) und eine Anfrage wird weitergegeben:/AccessDenied, und der entsprechende Controller/AccessDenied wird die Anfrage abwickelt und einen JSON, das die Überprüfungsfehlerinformationen an den Client enthält, zurückgibt. Dies sendet die Anfrage /moduleAccess.do. Wenn die Überprüfung fehlschlägt, leiten Sie die /AccessDenieded -Anfrage weiter, da sie sonst normal ausgeführt wird. Es wurde erkannt, nachdem er um einen so großen Kreis gegangen war.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.