SpringMVC 自定义拦截器 Interceptor
程序员文章站
2022-05-30 20:41:11
...
如上图所示,使用了mvc的标签库。本地引入路径。
自定义拦截器Interceptor。
1:实现HandlerInterceptor(import org.springframework.web.servlet.HandlerInterceptor;)
preHandle:执行Controller处理方法前执行
postHandle:执行Controller处理方法后,页面渲染前执行
afterCompletion:页面渲染后执行
//自定义登陆拦截器
public class LoginInterceptor implements HandlerInterceptor{
//preHandle方法:在执行Controller的处理方法之前被执行LoginInterceptor 的preHandle方法。
//执行一些初始化,权限判断,日志等处理。 如果返回false 将不会执行Controller中的处理方法
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
Object object) throws Exception {
//登陆拦截器:
//1:判断session中是否有值,若有值,则执行Controller的处理方法。
//2:若session中没有值。判断请求是否访问登陆页面login.do或者跳转登陆页面toLogin.do。若是,则执行Controller的处理方法。
//3:跳转至登陆页面。不执行Controller的处理方法。
HttpSession session = req.getSession();
if(session.getAttribute("user")!=null)
return true;
String path=req.getRequestURI();
if(path.endsWith("toLogin.do")||path.endsWith("login.do"))
return true;
resp.sendRedirect("toLogin.do");
return false;
}
//在Controller处理方法执行之后,在被渲染之前 执行 。关闭,释放,处理一些Controller执行中需要的资源
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
}
//在渲染器渲染后被执行。处理一个请求后的一些清理
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
}
2:Interceptor拦截器在xml 中的配置
添加标签库关注如下:
xmlns:mvc="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
主要关注<mvc:interceptors>标签中的内容。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置handerAdapter 适配器 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!-- 将视图名 渲染后视图的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 渲染后视图的后缀 -->
<property name="suffix" value=".jsp"/>
<!-- 例:视图名为:hello 渲染后:/WEB-INF/jsp/hello.jsp 该页面-->
</bean>
<!-- spring容器扫描指定包下的所有类,如果类上有注解 那么根据注解产生相应bean对象已经映射信息 -->
<!-- 拦截器的配置 -->
<mvc:interceptors>
<!-- 在 mvc:interceptors中可以配置多个拦截器,多个拦截器按顺序一一执行-->
<mvc:interceptor>
<!-- 指明哪些请求需要被拦截 /login.do 表示login.do需要被拦截 /user/add.do 表示/user/add.do请求要被拦截 -->
<!-- /* 表示项目路径下的所有请求被拦截, 可以拦截: /login.do /add.do /user.do /sys.do等 -->
<!-- /** 表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截。 可以拦截: /login.do /add.do /user.do /sys.do /user/add.do -->
<mvc:mapping path="/**"/>
<!-- 指定拦截器的位置 -->
<bean class="cn.sxt.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<context:component-scan base-package="cn.sxt.controller"/>
</beans>