SpringMVC:拦截器

SpringMVC:拦截器

2019-10-19 / Java / 狂神说位置: Home » Java » 本页

概述

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

自定义拦截器

那如何实现拦截器呢?

想要自定义拦截器,必须实现 HandlerInterceptor 接口。

  1. 新建一个Moudule , springmvc-07-Interceptor , 添加web支持
  2. 配置web.xml 和 springmvc-servlet.xml 文件
  3. 编写一个拦截器
    package com.kuang.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
    
        //在请求处理的方法之前执行
        //如果返回true执行下一个拦截器
        //如果返回false就不执行下一个拦截器
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            System.out.println("------------处理前------------");
            return true;
        }
    
        //在请求处理方法执行之后执行
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("------------处理后------------");
        }
    
        //在dispatcherServlet处理后执行,做清理工作.
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("------------清理------------");
        }
    }
  4. 在springmvc的配置文件中配置拦截器
    <!--关于拦截器的配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--/** 包括路径及其子路径-->
            <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
            <!--/admin/** 拦截的是/admin/下的所有-->
            <mvc:mapping path="/**"/>
            <!--bean配置的就是拦截器-->
            <bean class="com.kuang.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  5. 编写一个Controller,接收请求
    package com.kuang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    //测试拦截器的控制器
    @Controller
    public class InterceptorController {
    
        @RequestMapping("/interceptor")
        @ResponseBody
        public String testFunction() {
            System.out.println("控制器中的方法执行了");
            return "hello";
        }
    }
  6. 前端 index.jsp
    <a href="${pageContext.request.contextPath}/interceptor">拦截器测试</a>
  7. 启动tomcat 测试一下!

验证用户是否登录 (认证用户)

实现思路

  1. 有一个登陆页面,需要写一个controller访问页面。
  2. 登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。
  3. 拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面

代码编写

  1. 编写一个登陆页面 login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    
    <h1>登录页面</h1>
    <hr>
    
    <body>
    <form action="${pageContext.request.contextPath}/user/login">
        用户名:<input type="text" name="username"> <br>
        密码: <input type="password" name="pwd"> <br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
  2. 编写一个Controller处理请求
    package com.kuang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpSession;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        //跳转到登陆页面
        @RequestMapping("/jumplogin")
        public String jumpLogin() throws Exception {
            return "login";
        }
    
        //跳转到成功页面
        @RequestMapping("/jumpSuccess")
        public String jumpSuccess() throws Exception {
            return "success";
        }
    
        //登陆提交
        @RequestMapping("/login")
        public String login(HttpSession session, String username, String pwd) throws Exception {
            // 向session记录用户身份信息
            System.out.println("接收前端==="+username);
            session.setAttribute("user", username);
            return "success";
        }
    
        //退出登陆
        @RequestMapping("logout")
        public String logout(HttpSession session) throws Exception {
            // session 过期
            session.invalidate();
            return "login";
        }
    }
  3. 编写一个登陆成功的页面 success.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <h1>登录成功页面</h1>
    <hr>
    
    ${user}
    <a href="${pageContext.request.contextPath}/user/logout">注销</a>
    </body>
    </html>
  4. 在 index 页面上测试跳转!启动Tomcat 测试,未登录也可以进入主页!
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <h1>首页</h1>
      <hr>
      <%--登录--%>
      <a href="${pageContext.request.contextPath}/user/jumplogin">登录</a>
      <a href="${pageContext.request.contextPath}/user/jumpSuccess">成功页面</a>
      </body>
    </html>
  5. 编写用户登录拦截器
    package com.kuang.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    public class LoginInterceptor implements HandlerInterceptor {
    
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
            // 如果是登陆页面则放行
            System.out.println("uri: " + request.getRequestURI());
            if (request.getRequestURI().contains("login")) {
                return true;
            }
    
            HttpSession session = request.getSession();
    
            // 如果用户已登陆也放行
            if(session.getAttribute("user") != null) {
                return true;
            }
    
            // 用户没有登陆跳转到登陆页面
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            return false;
        }
    
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    
        }
    
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
        }
    }
  6. 在Springmvc的配置文件中注册拦截器
    <!--关于拦截器的配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean id="loginInterceptor" class="com.kuang.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  7. 再次重启Tomcat测试!

OK,测试登录拦截功能无误.

文章来源https://blog.kuangstudy.com/index.php/archives/484/该博主,侵权请联系删除

原文地址:https://www.cnblogs.com/GOOGnine/p/12271271.html

时间: 2024-10-25 13:20:19

SpringMVC:拦截器的相关文章

SpringMVC 拦截器理解

SpringMVC 配置拦截器 1. 作为拦截器当然是为了拦截 (这不是废话嘛) 那拦截是为了干嘛? 它可以帮我们拦截未登录用户   验证是否登录.设置日志记录.统计一些接口访问量啊 进行统一异常处理  设置一些数据啊 或者计算下应用接口方法执行效率啊 等等   2. 配置拦截器 由于用的是SpringMVC所以要知道 它是有个统一的 DispatcherServlet 控制器, 所以就不用传统的bean方式了,人家给我们提供了其他简单的方式 如下所示:  (我设置了三个方便测试用的) <!--

如何使用SpringMVC拦截器

如何使用SpringMVC拦截器 自定义一个拦截器,要实现HandlerInterceptor接口: public class MyInteceptor implements HandlerInterceptor { 略... } Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截. Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器. 当一个请求按Order值从小到

SpringMVC拦截器(实现登录验证拦截器)

本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 St

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

SpringMVC拦截器的使用

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间. 一.springMVC拦截器的实现方式 springMVC拦截器的实现一般有两种方式:第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口.第二种方式是继承实现了HandlerInterceptor接口的类,比

SpringMVC拦截器详解[附带源码分析]

目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. Hand

SpringMVC拦截器(资源和权限管理)-login拦截

SpringMVC拦截器(资源和权限管理) 1.自定义拦截器 SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法.preHandle在业务处理器处理请求之前被调用,    postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 .所以要想实现自己的权限管理逻辑,

SpringMVC拦截器_1_拦截器的实现

SpringMVC interceptor:下列参考的blog文章 Spring MVC简介 SpringMVC 拦截器实现原理和登录实现 SpringMVC拦截器详解[附带源码分析] 学习SpringMVC--拦截器 ********************* 1-1 拦截器 拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强. 使用场景:解决请求的共性问题(如:乱码问题,权限验证等) ===2 拦截器的实现========================== ---2-1 拦截器

SpringMVC拦截器2(资源和权限管理)(作为补充说明)

SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet.    DispatcherServlet是前置控制器,配置在web.xml文件中的.拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理.  所以我们现在web.xml中加入以下配置: [html] view plain co

springmvc拦截器启动报错

今天搞springmvc拦截器 启动项目异常 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Initialization of bean failed; nested exception is o