この記事では、主にSpringMVCインターセプターを紹介します。
1.DispatcherServlet
SpringMVCには統一されたエントリDispatcherServletがあり、すべてのリクエストがDispatcherServletを通過します。
DispatcherServletは、web.xmlファイルで構成されたプリコントローラーです。一致する要求を傍受するには、サーブレットインターセプトマッチングルールを単独で定義する必要があり、インターセプトされたリクエストは、処理の特定のルールに従ってターゲットコントローラーに配布する必要があります。したがって、次の構成をWeb.xmlに追加します。
<! - DispatcherServletを初期化するとき、フレームワークはWebアプリケーションWeb-INFディレクトリの[Servlet-Name] -servlet.xmlという名前のファイルを探し、そこに関連する豆を定義し、グローバルに定義された豆をオーバーライドします - > <サーブレット> <サーブレット - ネーム> Springmybatis </servlet-name> <Servlet-Class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet-mapping> <servlet-name> springmybatis </servet-name> < </サーブレットマッピング>
2。静的リソースは傍受しません
*.do形式と同様のURLのインターセプトのみを構成する場合、静的リソースへのアクセスに問題はありません。ただし、構成がすべてのリクエストをインターセプトする場合(上記の「/」など)、JSファイル、CSSファイル、画像ファイルなどの静的リソースがアクセスできなくなります。
一般に、インターセプターは主に許可管理のために実装され、主にいくつかのURL要求を傍受するため、静的リソースは傍受されません。通常、静的リソースを除外するには2つの方法があります。
最初のものは<MVC:デフォルトセルバーハンドラー />を使用することです(通常、Webアプリケーションサーバーのデフォルトサーブレット名は「デフォルト」です。したがって、Tomcatのデフォルトサーブレットをアクティブにして静的ファイルを処理し、Web.xmlで次のコードを構成します:)
<! - サーブレットは、Tomcat、Jettyなどのコンテナ用に提供され、 / to / static /ディレクトリから静的リソースマッピングを変更します。たとえば、http://localhost/foo.cssにアクセスしたとき、今http://localhost/static/foo.css-> <! - 静的ファイルをインターセプトしないでください - > <servlet-name>デフォルト</servet-name> <url-pattern/js/*</ur-diptern> <url-pattern>/css/*</url-pattern> <url-pattern>/amiges/*</url-pattern> <url-pattern>/fonts/*</url-pattern> </servlet-mapping>
Tomcat、Jetty、Jboss、およびGlassfishデフォルトサーブレットの名前 - 「デフォルト」
デフォルトサーブレットの名前を樹脂---「樹脂ファイル」
weblogicデフォルトサーブレット名 - 「fileservlet」
WebSphereデフォルトのサーブレット名 - 「SimpleFileservlet」
すべてのWebアプリケーションサーバーのデフォルトのサーブレット名が「デフォルト」ではない場合、デフォルトのServlet-Nameプロパティを介して指定されたものを表示する必要があります。
<MVC:default-servlethandler default-servlet-name = "デフォルトでWebサーバーで使用されるサーブレット名" />
2番目のタイプは、<MVC:リソース />を使用し、SpringMVC構成ファイルに次のコードを追加することです。
<MVC:リソースマッピング= "/js/**" location = "/static_resources/javascript/"/> <mvc:リソースマッピング= "/**" location = "/static_resources/css/"/> <mvc:リソースマッピング= "/**
3。カスタムインターセプター
SpringMVCのインターセプターハンドラーインターセプトラダプターは、3つのPreHandle、Posthandle、およびAftercompletionメソッドを提供します。 PreHandleは、サービスプロセッサがリクエストを処理する前に呼び出されます。
POSTHANDLEは、ビジネスプロセッサがリクエストの実行を完了し、ビューを生成した後に実行されます。 DispatcherServletがリクエストを完全に処理し、リソースなどをクリーンアップするために使用できる後、後部の整理が呼び出されます。したがって、独自の許可管理ロジックを実装するには、HandlerInterceptorAdapterを継承し、3つの方法を書き換える必要があります。
まず、SpringMvc.xmlに独自の定義インターセプターを追加します。私の実装ロジックcommonEnterceptor。
<! - インターセプター、複数のインターセプターを構成し、順次実行 - > <MVC:インターセプター> <MVC:インターセプター> <! - URLパスを一致させます。構成または/**を構成しない場合、すべてのコントローラーがインターセプトされます - > <MVC:マッピングパス= "/user/**"/> <mvc:マッピングpath = "/test/**"/> <bean> </mvc:interceptor> <! - 複数のインターセプターを設定するとき、最初のメソッドを呼び出します。逆順序での迎撃 - > </mvc:インターセプター>
私のインターセプトロジックは「ログインする前に、アクセスURLがログインページにジャンプします。ログインが成功した後、前のURLにジャンプします」、特定のコードは次のとおりです。
/ ** * */パッケージcom.alibaba.interceptor; javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 org.slf4j.loggerをインポートします。 org.slf4j.loggeractoryをインポートします。 Import org.springframework.web.servlet.modelandview; org.springframework.web.servlet.handler.handlerInterceptorAdapterをインポートします。 com.alibaba.util.requestutilをインポートします。 / ** * @author tfj * 2014-8-1 */ public class commonEnterceptor extends HandlerInterceptorAdapter {private final logger log = loggerfactory.getLogger(commonEnterceptor.class); public static final string last_page = "com.alibaba.lastpage"; / * *プライベート文字列Mappingurlを傍受する必要があるパスへの通常のマッピングを使用します。 public void setMappingurl(string mappingurl){this.mappingurl = mappingurl; } * / / / **は、ビジネスプロセッサがリクエストを処理する前に呼び出されます * falseが現在のインターセプターからすべてのインターセプターのdecompletion()を実行する場合、 *すべてのインターセプターが実行されるまで、インターセプターを実行します *インターセプターチェーンを実行します。最後のインターセプターから */ @Override public boolean prehandle(httpservletrequest request、httpservletresponse応答、オブジェクトハンドラー)は例外{if( "get" .equalsignorecase(request.getmethod()){requestutil.saverequest(); } log.info( "============== string requesturi = request.getRequesturi();文字列contextpath = request.getContextPath(); string url = requesturi.substring(contextpath.length()); log.info( "requesturi:"+requesturi); log.info( "contextpath:"+contextpath); log.info( "url:"+url); string username =(string)request.getSession()。getAttribute( "user"); if(username == null){log.info( "interceptor:ログインページにジャンプ!"); request.getRequestDispatcher( "/web-inf/jsp/login.jsp")。 falseを返します。 } else trueを返します。 } / ***ビジネスプロセッサがリクエストの処理を完了した後、ビューが生成される前に実行されるアクション* ModelandViewにデータを追加できます。 log.info( "======================================================================================== log.info( "==================================================================================== =========================================================================================== =========================================================================================== ===========================================================================================応答、オブジェクトハンドラー、例外ex)スロー{log.info( "==========注:上記のコードで、私はrequestutilを書きました。これは、主に現在のリクエスト、セッションオブジェクトの取得、ページの保存と暗号化などの関数を実装し、取り出します。
この時点で、インターセプターが実装されており、効果は図に示されています。
私は直接訪問 /テスト /こんにちはによってブロックされます
ログインして正常にログインした後、 /テスト /こんにちはに対応するページにジャンプします
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。