您的位置 首页 java

springmvc中的拦截器Interceptor

1. 自定义拦截器类实现 HandlerInterceptor 接口

实现接口后必须实现三个执行方法,如下

  • public boolean preHandle(HttpServletRequest request ,HttpServletResponse response,Object handler) ;此方法在控制器方法前执行,返回值为true时,表示继续执行控制器Controller中的请求处理方法;为false时中断后续执行,跳出。
  • public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mav);在控制器中的方法调用后,且解析视图前执行,可以对请求域中的模型和视图做进一步修改。
  • public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) ;在整个请求完成,即视图渲染结束后执行,可以实现资源清理,记录日志信息等。

2. 配置SpringMVC核心配置文件

要使自定义的拦截器生效,需要对其进行核心文件配置,可以配置全局拦截,指定url模式拦截等信息。

<mvc:interceptors>

// 全局拦截器,拦截所有请求

<bean class=””/>

<mvc:interceptor>

// “/**” 表示拦截所有路径

<mvc:mapping path=”/**” />

// “exclude-mapping” 表示不需要拦截的路径

<mvc:exclude-mapping path=”” />

<bean class=”” />

</mvc:interceptor>

<mvc:interceptor>

// 表示拦截所有以”/hello” 结尾的路径

<mvc:mapping path=”/hello” />

<bean class=”” />

</mvc:interceptor>

</mvc:interceptors>

springmvc中的拦截器Interceptor

3. 拦截器执行的流程

3.1 单个拦截器执行

springmvc中的拦截器Interceptor

springmvc中的拦截器Interceptor

单个拦截器的工作流程

3.2 多个拦截器执行

springmvc中的拦截器Interceptor

多个拦截器的工作流程

4. 用户登录拦截测试

4.1 自定义拦截器类LoginInterceptor.java

package com.dc.Intercptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.Http session ;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import com.dc.po.User;

public class LoginInterceptor implements HandlerInterceptor {

/**

* 控制器方法执行前调用

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

// TODO Auto-generated method stub

System.out.println(“LoginInterceptor … preHandle”);

String url = request.getRequestURI();

// URL:除了login. jsp 是可以随意访问,其他的都进行拦截

if (url.indexOf(“login”) > 0) {

return true;

}

// 检查是否你登陆

HttpSession session = request.getSession();

User user = (User) session.getAttribute(“USER”);

if (user != null) {

return true;

}

// 不符合条件的:没有登陆的,拦截处理掉

request.setAttribute(“msg”, “你还没有登陆”);

request.getRequestDispatcher(“/WEB-INF/jsp/login.jsp”).forward(request, response);

return false;

}

/**

* 控制器方法调用后,视图解析前

*/

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

// TODO Auto-generated method stub

System.out.println(“LoginInterceptor … postHandle”);

}

/**

* 整个请求完成,即视图解析渲染后执行

*/

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception {

// TODO Auto-generated method stub

System.out.println(“LoginInterceptor … afterCompletion”);

}

}

4.2 配置springmvc-config.xml ,使自定义拦截器生效

<!– 配置 SpringMVC 拦截器 –>

<mvc:interceptors>

<!– 使用 Bean 直接在 <mvc:interceptors> 下配置全局的拦截器,拦截所有的请求 –>

<bean class=”com.dc.Intercptor.CustomIntercptor” />

<mvc:interceptor>

<!– 配置拦截器 UserInterceptor作用的路径 –>

<mvc:mapping path=”/**” />

<mvc:exclude-mapping path=”” />

<bean class=”com.dc.Intercptor.UserInterceptor” />

</mvc:interceptor>

<mvc:interceptor>

<!– 配置拦截器 AdmInterceptor作用的路径 以 /hello 结尾的路径 –>

<mvc:mapping path=”/hello” />

<bean class=”com.dc.Intercptor.AdmInterceptor” />

</mvc:interceptor>

<mvc:interceptor>

<!– 配置拦截器 LoginInterceptor 作用的路径径 –>

<mvc:mapping path=”/**” />

<bean class=”com.dc.Intercptor.LoginInterceptor” />

</mvc:interceptor>

</mvc:interceptors>

4.3 修改对应的控制器类的处理方法

/**

* 用户登录处理

*/

@RequestMapping(value = “/login”, method = RequestMethod.GET)

public String login(User user, Model model, HttpSession session) {

// User 是 com.dc.po 包下的POJO 类

String usernameString = user.getUsername();

String passString = user.getPassword();

if (usernameString != null && usernameString.equals(“老王”)

&& passString != null && passString.equals(123456)) {

// 登录成功,将用户信息添加到Session中

session.setAttribute(“USER”, user);

return “redirect:main”;

}

model.addAttribute(“msg”, “用户没有登陆”);

return “login”;

}

4.4 添加 login.jsp 视图页面

<%@ page language=”java” contentType=”text/ html ; charset=UTF-8″

pageEncoding=”UTF-8″%>

<!DOCTYPE html>

<html>

<head>

<meta charset=”UTF-8″>

<title>登录</title>

</head>

<body>

${msg }

<form action=”${pageContext.request.contextPath }/login” method=”post”>

用户名:<input type=”text” name=”username” />

密码:<input type=”text” name=”password” />

<input type=”submit” value=” 登 录 ” />

</form>

</body>

</html>

在这里就不贴测试结果,大家有兴趣可以自行测试下效果。

今天拦截器就讲解到这里,更深的知识后期更新。

文章来源:智云一二三科技

文章标题:springmvc中的拦截器Interceptor

文章地址:https://www.zhihuclub.com/187466.shtml

关于作者: 智云科技

热门文章

网站地图