Breaking News
4748419

Hướng dẫn sử dụng Spring MVC Interceptor

Theo dõi FusionsuitesNews trên

xem thêm:

1- spring interceptor là gì?

khi bạn tới công ty và muốn gặp sếp của công ty đó. bạn cần phải đi qua các chốt chặn (interceptor), các chốt chặn ở đây có thể là người bảo vệ cổng, nhân viên lễ tân,..

Bạn đang xem: Hướng dẫn sử dụng Spring MVC Interceptor

trong spring, khi một request được gửi đến controller, trước khi request được xử lý bởi controller, nó phải vượt qua các interceptor (0 hoặc nhiều).

spring interceptor là một khái niệm khá giống với servlet filter.

spring interceptor chỉ áp dụng đối với các request đang được gửi đến một controller.

hướng dẫn sử dụng spring mvc interceptor

bạn có thể sử dụng interceptor để làm một số việc, chẳng hạn như ghi lại log, thêm hoặc cập nhập các cấu hình trước khi request được xử lý bởi controller, …

một trong các ứng dụng spring mvc có sử dụng interceptor là “Ứng dụng web đa ngôn ngữ”. bạn có thể xem thêm về ứng dụng này tại đây:

hướng dẫn sử dụng spring mvc interceptor

lớp interceptor của bạn cần phải thực hiện interface org.springframework.web.servlet.handlerinterceptor hoặc mở rộng từ lớp org.springframework.web.servlet.handler.handlerinterceptoradapter.

bạn cần phải triển khai 3 phương thức trừu tượng:

  • public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler)
  • public void posthandle(httpservletrequest request, httpservletresponse response, object handler,modelandview modelandview)
  • public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex)

chú ý: phương thức prehandle trả về true hoặc false. nếu trả về true nghĩa là request sẽ tiếp tục đi tới đích của nó (là một controller) .

một request có thể phải vượt qua nhiều interceptor. hình dưới đây minh họa điều đó.

hướng dẫn sử dụng spring mvc interceptor

Xem thêm: Mlem mlem là gì? Giải mã nghĩa của từ Mlem Mlem – Giải trí Việt Nam

hướng dẫn sử dụng spring mvc interceptor

hướng dẫn sử dụng spring mvc interceptor

hướng dẫn sử dụng spring mvc interceptor

  • group id: org.o7planning
  • artifact id: springmvcinterceptor
  • package: org.o7planning.springmvcinterceptor

hướng dẫn sử dụng spring mvc interceptor

project đã được tạo ra:

hướng dẫn sử dụng spring mvc interceptor

Đảm bảo bạn sử dụng java >=6.

project properties:

hướng dẫn sử dụng spring mvc interceptor

hướng dẫn sử dụng spring mvc interceptor

3- khai báo maven và web.xml

sử dụng servlet api >= 3.

web.xml

 <?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="webapp_id" version="3.0"> <display-name>springmvcinterceptor</display-name> </web-app> 

pom.xml

 <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <groupid>org.o7planning</groupid> <artifactid>springmvcinterceptor</artifactid> <packaging>war</packaging> <version>0.0.1-snapshot</version> <name>springmvcinterceptor maven webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- servlet api --> <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- jstl for jsp page --> <!-- http://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency> <groupid>javax.servlet</groupid> <artifactid>jstl</artifactid> <version>1.2</version> </dependency> <!-- jsp api --> <!-- http://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api --> <dependency> <groupid>javax.servlet.jsp</groupid> <artifactid>jsp-api</artifactid> <version>2.2</version> <scope>provided</scope> </dependency> <!-- spring dependencies --> <!-- http://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-core</artifactid> <version>4.3.3.release</version> </dependency> <!-- http://mvnrepository.com/artifact/org.springframework/spring-web --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>4.3.3.release</version> </dependency> <!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>4.3.3.release</version> </dependency> </dependencies> <build> <finalname>springmvcinterceptor</finalname> <plugins> <!-- config: maven tomcat plugin --> <!-- http://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin --> <plugin> <groupid>org.apache.tomcat.maven</groupid> <artifactid>tomcat7-maven-plugin</artifactid> <version>2.2</version> <!-- config: contextpath and port (default - /springmvcinterceptor : 8080) --> <!-- <configuration> <path>/</path> <port>8899</port> </configuration> --> </plugin> </plugins> </build> </project> 

hướng dẫn sử dụng spring mvc interceptor

springwebappinitializer.java

 package org.o7planning.springmvcinterceptor.config; import javax.servlet.servletcontext; import javax.servlet.servletexception; import javax.servlet.servletregistration; import org.springframework.web.webapplicationinitializer; import org.springframework.web.context.support.annotationconfigwebapplicationcontext; import org.springframework.web.servlet.dispatcherservlet; public class springwebappinitializer implements webapplicationinitializer  @override public void onstartup(servletcontext servletcontext) throws servletexception  annotationconfigwebapplicationcontext appcontext = new annotationconfigwebapplicationcontext(); appcontext.register(applicationcontextconfig.class); servletregistration.dynamic dispatcher = servletcontext.addservlet("springdispatcher", new dispatcherservlet(appcontext)); dispatcher.setloadonstartup(1); dispatcher.addmapping("/");   

applicationcontextconfig.java

 package org.o7planning.springmvcinterceptor.config; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.componentscan; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.view.internalresourceviewresolver; @configuration @componentscan("org.o7planning.springmvcinterceptor.*") public class applicationcontextconfig  @bean(name = "viewresolver") public internalresourceviewresolver getviewresolver()  internalresourceviewresolver viewresolver = new internalresourceviewresolver(); viewresolver.setprefix("/web-inf/pages/"); viewresolver.setsuffix(".jsp"); return viewresolver;   

các interceptor sẽ được đăng ký với ứng dụng bởi lớp webmvcconfig.

webmvcconfig.java

 package org.o7planning.springmvcinterceptor.config; import org.o7planning.springmvcinterceptor.interceptor.admininterceptor; import org.o7planning.springmvcinterceptor.interceptor.loginterceptor; import org.o7planning.springmvcinterceptor.interceptor.oldlogininterceptor; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.defaultservlethandlerconfigurer; import org.springframework.web.servlet.config.annotation.enablewebmvc; import org.springframework.web.servlet.config.annotation.interceptorregistry; import org.springframework.web.servlet.config.annotation.resourcehandlerregistry; import org.springframework.web.servlet.config.annotation.webmvcconfigureradapter; @configuration @enablewebmvc public class webmvcconfig extends webmvcconfigureradapter  // cấu hình để sử dụng các file nguồn tĩnh (html, image, ..) @override public void addresourcehandlers(resourcehandlerregistry registry)   @override public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer)  configurer.enable();  // @override public void addinterceptors(interceptorregistry registry)  // loginterceptor áp dụng cho mọi url. registry.addinterceptor(new loginterceptor()); // Đường dẫn login cũ, không còn sử dụng nữa. // sử dụng oldurlinterceptor để điều hướng tới một url mới. registry.addinterceptor(new oldlogininterceptor())// .addpathpatterns("/admin/oldlogin"); // interceptor này áp dụng cho các url có dạng /admin/* // loại đi trường hợp /admin/oldlogin registry.addinterceptor(new admininterceptor())// .addpathpatterns("/admin/*")// .excludepathpatterns("/admin/oldlogin");   

hướng dẫn sử dụng spring mvc interceptor

loginterceptor được áp dụng cho mọi request đang tiến đến một controller. (xem cấu hình trong webmvcconfig).

loginterceptor.java

 package org.o7planning.springmvcinterceptor.interceptor; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.modelandview; import org.springframework.web.servlet.handler.handlerinterceptoradapter; public class loginterceptor extends handlerinterceptoradapter  @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception  long starttime = system.currenttimemillis(); system.out.println("\n-------- loginterception.prehandle --- "); system.out.println("request url: " + request.getrequesturl()); system.out.println("start time: " + system.currenttimemillis()); request.setattribute("starttime", starttime); return true;  @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception  system.out.println("\n-------- loginterception.posthandle --- "); system.out.println("request url: " + request.getrequesturl()); // Ở đây, bạn có thể add các attribute vào modelandview // và sử dụng nó trong các view (jsp,..)  @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception  system.out.println("\n-------- loginterception.aftercompletion --- "); long starttime = (long) request.getattribute("starttime"); long endtime = system.currenttimemillis(); system.out.println("request url: " + request.getrequesturl()); system.out.println("end time: " + endtime); system.out.println("time taken: " + (endtime - starttime));   

oldlogininterceptor là một chốt chặn (interceptor), nếu người dùng nhập vào đường dẫn /admin/oldlogin nó sẽ chuyển hướng tới đường dẫn mới là /admin/login.

hướng dẫn sử dụng spring mvc interceptor

Xem thêm: business

hướng dẫn sử dụng spring mvc interceptor

oldlogininterceptor.java

 package org.o7planning.springmvcinterceptor.interceptor; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.modelandview; import org.springframework.web.servlet.handler.handlerinterceptoradapter; public class oldlogininterceptor extends handlerinterceptoradapter  @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception  system.out.println("\n-------- oldlogininterceptor.prehandle --- "); system.out.println("request url: " + request.getrequesturl()); system.out.println("sorry! this url is no longer used, redirect to /admin/login"); response.sendredirect(request.getcontextpath()+"/admin/login"); return false;  @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception  // Đoạn code này sẽ không được chạy. system.out.println("\n-------- oldlogininterceptor.posthandle --- ");  @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception  // Đoạn code này sẽ không được chạy. system.out.println("\n-------- querystringinterceptor.aftercompletion --- ");   

admininterceptor.java

 package org.o7planning.springmvcinterceptor.interceptor; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.modelandview; import org.springframework.web.servlet.handler.handlerinterceptoradapter; public class admininterceptor extends handlerinterceptoradapter  @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception  system.out.println("\n-------- admininterceptor.prehandle --- "); return true;  @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception  system.out.println("\n-------- admininterceptor.posthandle --- ");  @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception  system.out.println("\n-------- admininterceptor.aftercompletion --- ");   

maincontroller.java

 package org.o7planning.springmvcinterceptor.controller; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; @controller public class maincontroller  @requestmapping(value =  "/", "/test" ) public string test(model model)  system.out.println("\n-------- maincontroller.test --- "); system.out.println(" ** you are in controller ** "); return "test";  // Đường dẫn này không còn sử dụng nữa. // nó sẽ bị chuyển hướng bởi oldlogininterceptor @deprecated @requestmapping(value =  "/admin/oldlogin" ) public string oldlogin(model model)  // code ở đây không bao giờ được chạy. return "oldlogin";  @requestmapping(value =  "/admin/login" ) public string login(model model)  system.out.println("\n-------- maincontroller.login --- "); system.out.println(" ** you are in controller ** "); return "login";   

hướng dẫn sử dụng spring mvc interceptor

hướng dẫn sử dụng spring mvc interceptor

hướng dẫn sử dụng spring mvc interceptor

hướng dẫn sử dụng spring mvc interceptor

chạy đường dẫn:

hướng dẫn sử dụng spring mvc interceptor

và đây là log xem trên màn hình console:

hướng dẫn sử dụng spring mvc interceptor

chạy url:

hướng dẫn sử dụng spring mvc interceptor

xem log:

hướng dẫn sử dụng spring mvc interceptor

Nguồn: https://fusionsuitesvungtau.com.vn
Danh mục: Hỏi đáp ✅

test