SpringMVC(三)SpringMVC拦截器的配置和使用

1. 拦截器的作用

  • Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 用户可以自己定义一些拦截器来实现特定的功能。
  • 拦截器和过滤器的不同
      1. 过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用
      2. 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用
      3. 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截
       4. 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的
       5.拦截器也是AOP思想的一种实现方式
       6. 想要自定义拦截器,需要实现HandlerInterceptor接口

2. 拦截器的配置

在这里插入图片描述

  • 编写控制器
@Controller
public class InterContorller {
    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("testInterceptor执行了");
        return "success";
    }
}
  • 在springmvc.xml中配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path=""/>
            <bean class="interceptor.Interceptor01"/>
        </mvc:interceptor>
    </mvc:interceptors>
  • 在上述配置中:
    <mvc:interceptors> 元素用于配置一组拦截器
    <mvc:interceptor> 元素中定义的是指定路径的拦截器,表示匹配指定路径的请求才进行拦截
    <mvc:mapping> 用于配置拦截器作用的路径
    path 的属性值“/**”表示拦截所有路径
    <mvc:exclude-mapping> 配置不需要拦截作用的路径
    < bean class=" "/>配置拦截器对象

3. 拦截器的方法

  • 定义Interceptor01类继承HandlerInterceptor接口,并实现了接口中的 3 个方法:
  1. preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
  2. postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
  3. afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行。

4.拦截器执行顺序

  • 在配置文件中如果只定义了一个拦截器,程序将首先执行拦截器类中的 preHandle 方法,如果 true,(若为false,则中断执行)程序将继续执行控制器中处理请求的方法,返回视图前将执行 postHandle 方法,返回视图后才执行 afterCompletion 方法。
    preHandle ——>控制器Controller——>postHandle ——>afterCompletion
public class Interceptor01 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle 拦截器拦截了");
        return true;//此方法只有返回true时,程序才能被拦截
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle 方法执行了");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion 方法执行了");
    }
}

执行结果:
在这里插入图片描述

  • 创建Interceptor02类,实现HandlerInterceptor接口中的方法,在springmvc.xml文件中在配置Interceptor02拦截器,运行结果如下:
    ## 4. 拦截器的配置

5. 拦截器简单案例

  • 验证用户登录
    登录页面有一提交表单的动作。需要在 controller 中处理。
      1.1 判断用户名密码是否正确
      1.2 如果正确 向 session 中写入用户信息
      1.3 返回登录成功。
    拦截用户请求,判断用户是否登录
       2.1如果用户已经登录,放行
      2.2如果用户未登录,跳转到登录页面
  1. 创建一个用户实体类
public class User implements Serializable {
    private String uname;
    private String upwd;
    //省略setter和getter方法
    }
  1. 创建UserController控制器类
@Controller
public class UserController {
    //登录页面初始化
    @RequestMapping("/initLogin")
    public String testinitLogin(){
        return "login";
    }
    // 跳转到主页面
    @RequestMapping("/main")
    public String testMain(){
        return "main";
    }
    //退出登录
    @RequestMapping("/logout")
    public String testlogout(HttpSession session){
        // 清除 session
        session.invalidate();
        return "login";
    }
    //处理登录功能
    @RequestMapping("/login")
    public String login(User user, Model model, HttpSession session){
        if("叶子".equals(user.getUname())&&"123".equals(user.getUpwd())){
            session.setAttribute("user",user);
            //重定向到主页面
            return "redirect:main";
        }
        model.addAttribute("msg","户名或密码错误,请重新登录!");
        return "login";
    }
}
  1. 创建拦截器类LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //如果是登录页面则放行
        if (request.getRequestURI().indexOf("/toLogin") >= 0 || request.getRequestURI().indexOf("/login") >= 0) {
            return true;
        }
        //如果用户已登录也放行
        HttpSession session = request.getSession();
        if(session.getAttribute("user")!=null){
            return true;
        }
        //用户没有登录挑战到登录页面
        request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request,response);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
  1. 在springmvc.xml中配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.wink.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  1. 创建login.jsp和main.jsp
/***************index.jsp******************/
    <a href="/initLogin">测试登录</a>
/***************login.jsp******************/
	${msg}
	<form action="/login" method="post">
	    用户名:<input type="text" name="uname"/><br/>
	    密码:<input type="text" name="upwd"/><br/>
	    <input type="submit" value="登录"/>
	</form>
/***************main.jsp******************/
    当前用户:${user.uname}<br/>
    <a href="/logout">退出</a>

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值