Heim  >  Artikel  >  Java  >  Spring+SpringMVC+MyBatis vertiefendes Lernen und Konstruieren (17) – SpringMVC-Interceptor

Spring+SpringMVC+MyBatis vertiefendes Lernen und Konstruieren (17) – SpringMVC-Interceptor

PHP中文网
PHP中文网Original
2017-07-03 17:30:261405Durchsuche

Bitte geben Sie beim Nachdruck die Quelle an:

Wie bereits erwähnt: Spring+SpringMVC+MyBatis vertiefendes Lernen und Konstruieren (16) – SpringMVC-Annotationsentwicklung (fortgeschritten)

1.Interceptor-Definition

Der Prozessor-Interceptor von Spring Web MVC ähnelt dem Filter in der Servlet-Entwicklung, der zur Vor- und Nachbearbeitung des Prozessors verwendet wird.

Definieren Sie einen Interceptor und implementieren Sie die HandlerInterceptor-Schnittstelle. In der Schnittstelle stehen drei Methoden zur Verfügung.

<span style="color: #0000ff">package</span><span style="color: #000000"> joanna.yan.ssm.interceptor;

</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletRequest;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletResponse;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.web.servlet.HandlerInterceptor;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.web.servlet.ModelAndView;

</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> HandlerInterceptor1 <span style="color: #0000ff">implements</span><span style="color: #000000"> HandlerInterceptor{

    </span><span style="color: #008000">//</span><span style="color: #008000">执行Handler完成执行此方法
    </span><span style="color: #008000">//</span><span style="color: #008000">应用场景:统一异常处理,统一日志处理</span>
<span style="color: #000000">    @Override
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception {
        System.out.println(</span>"HandlerInterceptor1......afterCompletion"<span style="color: #000000">);
    }

    </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之后,返回modelAndView之前执行
    </span><span style="color: #008000">//</span><span style="color: #008000">应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里同意指定视图</span>
<span style="color: #000000">    @Override
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> postHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler, ModelAndView modelAndView) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception {
        System.out.println(</span>"HandlerInterceptor1......postHandle"<span style="color: #000000">);
    }

    </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之前执行
    </span><span style="color: #008000">//</span><span style="color: #008000">用于身份认证、身份授权
    </span><span style="color: #008000">//</span><span style="color: #008000">比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行。</span>
<span style="color: #000000">    @Override
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception {
        System.out.println(</span>"HandlerInterceptor1......preHandle"<span style="color: #000000">);
        </span><span style="color: #008000">//</span><span style="color: #008000">return false表示拦截,不向下执行
        </span><span style="color: #008000">//</span><span style="color: #008000">return true表示放行</span>
        <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">;
    }

}</span>

2. Interceptor-Konfiguration

Es gibt eine große Abfangkette in Struts. Sie kann zu jedem Aktionslink hinzugefügt werden, um sie abzufangen. Aber der Abfangjäger des Frühlings ist nicht global.

2.1 Interceptoren für eine bestimmte Zuordnung konfigurieren

Der springmvc-Interceptor legt Abfangeinstellungen für HandlerMapping fest. Wenn das Abfangen in einem HandlerMapping festgelegt ist, verwendet der Handler, der vom HandlerMapping erfolgreich zugeordnet wird, schließlich den Interceptor.

<span style="color: #0000ff"><</span><span style="color: #800000">bean
    </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"</span><span style="color: #0000ff">></span>
    <span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptors"</span><span style="color: #0000ff">></span>
        <span style="color: #0000ff"><</span><span style="color: #800000">list</span><span style="color: #0000ff">></span>
            <span style="color: #0000ff"><</span><span style="color: #800000">ref </span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="handlerInterceptor1"</span><span style="color: #0000ff">/></span>
            <span style="color: #0000ff"><</span><span style="color: #800000">ref </span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="handlerInterceptor2"</span><span style="color: #0000ff">/></span>
        <span style="color: #0000ff"></</span><span style="color: #800000">list</span><span style="color: #0000ff">></span>
    <span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span>
    <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="handlerInterceptor1"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor1"</span><span style="color: #0000ff">/></span>
    <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="handlerInterceptor2"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor2"</span><span style="color: #0000ff">/></span>

Im Allgemeinen nicht empfohlen.

2.2 Konfigurieren Sie globale Interceptoren für alle Zuordnungen

springmvc kann global-ähnliche Interceptoren konfigurieren, und das Springmvc-Framework fügt die konfigurierten global-ähnlichen Interceptoren in jedes HandlerMapping ein.

    <span style="color: #008000"><!--</span><span style="color: #008000">拦截器 </span><span style="color: #008000">--></span>
    <span style="color: #0000ff"><</span><span style="color: #800000">mvc:interceptors</span><span style="color: #0000ff">></span>
        <span style="color: #008000"><!--</span><span style="color: #008000">多个拦截器,顺序执行 </span><span style="color: #008000">--></span>
        <span style="color: #0000ff"><</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span>
            <span style="color: #008000"><!--</span><span style="color: #008000"> /**表示所有url包括子url路径 </span><span style="color: #008000">--></span>
            <span style="color: #0000ff"><</span><span style="color: #800000">mvc:mapping </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/**"</span><span style="color: #0000ff">/></span>
            <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor1"</span><span style="color: #0000ff">></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span>
        <span style="color: #0000ff"></</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span>
        <span style="color: #0000ff"><</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span>
            <span style="color: #0000ff"><</span><span style="color: #800000">mvc:mapping </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/**"</span><span style="color: #0000ff">/></span>
            <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor2"</span><span style="color: #0000ff">></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span>
        <span style="color: #0000ff"></</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span>
    <span style="color: #0000ff"></</span><span style="color: #800000">mvc:interceptors</span><span style="color: #0000ff">></span>

3. Abfangtest

3.1 Testanforderungen

Testen Sie den Ausführungszeitpunkt jeder Methode mehrerer Interceptoren.

3.2 Zwei Interceptoren schreiben

3.3 Beide Abfangjäger sind erlaubt

Protokollinformationen ausführen:

<span style="color: #000000">HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle

HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle

HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion</span>

Zusammenfassung:

Die preHandle-Methode wird der Reihe nach ausgeführt, und postHandle und afterCompletion werden in der umgekehrten Reihenfolge der Interceptor-Konfiguration ausgeführt.

3.4 Interceptor 1 ist erlaubt, aber Interceptor 2 ist nicht erlaubt

Protokollinformationen ausführen:

<span style="color: #000000">HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion</span>

Zusammenfassung:

Nachdem Interceptor 1 freigegeben wurde, wird das PreHandle von Interceptor 2 ausgeführt.

Das PreHandle von Interceptor 2 wird nicht freigegeben und das PostHandle und AfterCompletion von Interceptor 2 werden nicht ausgeführt.

Solange es einen Interceptor gibt, der nicht freigegeben wird, wird postHandle nicht ausgeführt.

3.5 Interceptor 1 ist nicht erlaubt, Interceptor 2 ist nicht erlaubt

Protokollinformationen ausführen:

HandlerInterceptor1...preHandle

Das PreHandle von Interceptor 1 wird nicht freigegeben und PostHandle und AfterCompletion werden nicht ausgeführt.

Das PreHandle von Interceptor 1 wird nicht freigegeben und Interceptor 2 wird nicht ausgeführt.

4. Zusammenfassung

Wenden Sie den Abfangjäger basierend auf den Testergebnissen an.

Zum Beispiel: Unified Log Processing Interceptor: Wenn das Interceptor-PreHandle geändert werden muss, muss es freigegeben und an der ersten Position in der Interceptor-Kette platziert werden.

Zum Beispiel: Login-Authentifizierungs-Interceptor, platziert an der ersten Position in der Interceptor-Kette. Der Berechtigungsüberprüfungs-Interceptor wird nach dem Login-Interceptor platziert. (Da die Berechtigungen nach der Anmeldung überprüft werden)

5. Interceptor-Anwendung (Implementierung der Anmeldeauthentifizierung)

5.1 Anforderungen

(1) Benutzeranforderungs-URL

(2) Interceptor führt die Abhörüberprüfung durch

Wenn es sich bei der angeforderten URL um eine öffentliche Adresse handelt (eine URL, auf die ohne Anmeldung zugegriffen werden kann), lassen Sie sie passieren

Wenn die Benutzersitzung nicht existiert, springen Sie zur Anmeldeseite.

Wenn die Benutzersitzung vorhanden ist, geben Sie sie frei und setzen Sie den Vorgang fort.

5.2 Methoden zum Anmelden und Beenden des Controllers

<span style="color: #0000ff">package</span><span style="color: #000000"> joanna.yan.ssm.controller;

</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpSession;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.stereotype.Controller;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.web.bind.annotation.RequestMapping;

@Controller
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> LoginController {
    
    </span><span style="color: #008000">//</span><span style="color: #008000">登录</span>
    @RequestMapping("/login"<span style="color: #000000">)
    </span><span style="color: #0000ff">public</span> String login(HttpSession session, String username, String password) <span style="color: #0000ff">throws</span><span style="color: #000000"> Exception{
        </span><span style="color: #008000">//</span><span style="color: #008000">调用service进行用户身份认证
        </span><span style="color: #008000">//</span><span style="color: #008000">...
        
        </span><span style="color: #008000">//</span><span style="color: #008000">在session中保存用户身份信息</span>
        session.setAttribute("username"<span style="color: #000000">, username);
        </span><span style="color: #0000ff">return</span> "redirect:items/queryItems.action"<span style="color: #000000">;
    }
    
    </span><span style="color: #008000">//</span><span style="color: #008000">退出</span>
    @RequestMapping("/logout"<span style="color: #000000">)
    </span><span style="color: #0000ff">public</span> String logout(HttpSession session) <span style="color: #0000ff">throws</span><span style="color: #000000"> Exception{
        </span><span style="color: #008000">//</span><span style="color: #008000">清除session</span>
<span style="color: #000000">        session.invalidate();
        </span><span style="color: #0000ff">return</span> "redirect:items/queryItems.action"<span style="color: #000000">;
    }
    
}</span>

5.3 Implementierung des Abfangens der Anmeldeauthentifizierung

5.3.1LoginInterceptor

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> LoginInterceptor <span style="color: #0000ff">implements</span><span style="color: #000000"> HandlerInterceptor{

    </span><span style="color: #008000">//</span><span style="color: #008000">执行Handler完成执行此方法
    </span><span style="color: #008000">//</span><span style="color: #008000">应用场景:统一异常处理,统一日志处理</span>
<span style="color: #000000">    @Override
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception {
        System.out.println(</span>"HandlerInterceptor1......afterCompletion"<span style="color: #000000">);
    }

    </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之后,返回modelAndView之前执行
    </span><span style="color: #008000">//</span><span style="color: #008000">应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里同意指定视图</span>
<span style="color: #000000">    @Override
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> postHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler, ModelAndView modelAndView) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception {
        System.out.println(</span>"HandlerInterceptor1......postHandle"<span style="color: #000000">);
    }

    </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之前执行
    </span><span style="color: #008000">//</span><span style="color: #008000">用于身份认证、身份授权
    </span><span style="color: #008000">//</span><span style="color: #008000">比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行。</span>
<span style="color: #000000">    @Override
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception {
        System.out.println(</span>"HandlerInterceptor1......preHandle"<span style="color: #000000">);
        </span><span style="color: #008000">//</span><span style="color: #008000">获取请求的url</span>
        String url=<span style="color: #000000">request.getRequestURI();
        </span><span style="color: #008000">//</span><span style="color: #008000">判断url是否是公开地址(实际使用时要将公开地址配置到文件中)
        </span><span style="color: #008000">//</span><span style="color: #008000">这里公开地址是登录提交的地址</span>
        <span style="color: #0000ff">if</span>(url.indexOf("login.action")>=0<span style="color: #000000">){
            </span><span style="color: #008000">//</span><span style="color: #008000">如果进行登录提交,放行</span>
            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">;
        }
        </span><span style="color: #008000">//</span><span style="color: #008000">判断session</span>
        HttpSession session=<span style="color: #000000">request.getSession();
        String username</span>=(String) session.getAttribute("username"<span style="color: #000000">);
        </span><span style="color: #0000ff">if</span>(username!=<span style="color: #0000ff">null</span><span style="color: #000000">){
            </span><span style="color: #008000">//</span><span style="color: #008000">身份存在,放行</span>
            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">;
        }
        
        </span><span style="color: #008000">//</span><span style="color: #008000">执行到这里,表示用户身份需要认证,跳转登录页面</span>
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp"<span style="color: #000000">).forward(request, response);
        
        </span><span style="color: #008000">//</span><span style="color: #008000">return false表示拦截,不向下执行
        </span><span style="color: #008000">//</span><span style="color: #008000">return true表示放行</span>
        <span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span><span style="color: #000000">;
    }

}</span>

5.3.2 Interceptor-Konfiguration

Konfiguration in springmvc.xml unter Klassenpfad:

Wenn dieser Artikel für Sie hilfreich ist, geben Sie mir bitte einen Tipp auf WeChat~

Das obige ist der detaillierte Inhalt vonSpring+SpringMVC+MyBatis vertiefendes Lernen und Konstruieren (17) – SpringMVC-Interceptor. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn