SpringMVC拦截器的使用以及登录拦截的案例

拦截器(Interceptor)

什么是拦截器

拦截器是springMVC 中的功能(Interceptor)、和过滤器类似、但是过滤器是servlet中的功能过滤器(Filter)、拦截器主要拦截请求、做出对应的拦截、类似判断用户是否登录等…

1、快速入门

  • 创建普通的web项目
  • 导入依赖
  • 编写Controller层
  • 编写拦截器(Interceptor)实现(HandlerInterceptor)
  • 配置拦截器(Interceptor)

1、创建一个普通的web项目

在这里插入图片描述

2、导入依赖

<dependencies>
  <!-- 为了方便,直接引入webmvc包,将会全部导入spring依赖包 -->
  <!-- spring -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.5.RELEASE</version>
  </dependency>
  <!--servlet-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

3、编写Controller层

@Controller
public class a {
    @RequestMapping("/a")
    @ResponseBody
    public void a(){
        System.out.println("a");
    }
    @RequestMapping("/b")
    @ResponseBody
    public void b(){
        System.out.println("b");
    }
    @RequestMapping("/c")
    @ResponseBody
    public void c(){
        System.out.println("c");
    }
}

4、编写拦截器(Interceptor)

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("====== 开始 ======");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("====== 结束 ======");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("====== 清理 ======");
    }
}

5、配置拦截器(Interceptor)

<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd ">

    <context:component-scan base-package="com.wei.controller"/>

   <mvc:interceptors>
       <mvc:interceptor>
           <mvc:mapping path="/a"/><!-- 要拦截的请求 -->
           <mvc:exclude-mapping path="/b"/><!-- 放行的请求 -->
           <bean class="com.wei.config.MyInterceptor"/>
       </mvc:interceptor>
   </mvc:interceptors>
</beans>

6、测试结果

访问/a请求时执行的效果
====== 开始 ======
a
====== 结束 ======
====== 清理 ======

小结:

拦截器有两种实现方式

  • 实现HandlerInterceptor接口、重写里面方法

  • 继承HandlerInterceptorAdapter类、重写里面的方法

  • public class MyInterceptor1 extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("开始");
            return true;
        }
    }
    

最后在spring的配置文件中配置拦截器。

2、登录案例

案例流程:访问/admin 如果登录就访问到后台、没有登录就登录。

  • 导入依赖

  • 编写controllerx

  • 编写拦截器

  • 配置拦截器

  • 编写页面

 <dependencies>
        <!-- 为了方便,直接引入webmvc包,将会全部导入spring依赖包 -->
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
</dependencies>

1、AdminController

@Controller
public class AdminController {
    /**
     * 登录
     * @param name 用户名
     * @param pwd  密码
     * @param request
     * @return
     */
    @RequestMapping("/adminLogin")
    public String login(@RequestParam("name")String name,
                        @RequestParam("pwd")String pwd,
                        HttpServletRequest request){
        if ("admin".equals(name) && "123456".equals(pwd)) {  // 如果正确
            request.getSession().setAttribute("admin",name); // 将名字传入session
            return "redirect:/admin";     //转发到admin.jsp页面
        }
        return "redirect:/login"; //错误就到登录页面
    }


    @RequestMapping("/admin")
    public String admin(){
        return "/admin"; //后台首页
    }

    @RequestMapping("/login")
    public String login(){
        return "login"; //登录页面
    }

    @RequestMapping("/")
    public String index(){
        return "index"; //前端首页
    }

}

2、编写拦截器

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("====== 开始 ======");
        String  name = (String) request.getSession().getAttribute("admin"); //从session域中获取到用户数据
        if (name == null) {
            response.sendRedirect("/login");  // 重定向到登录页面
            return false; // 拦截
        }else {
            return true;// 放行
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("====== 结束 ======");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("====== 清理 ======");
    }
}

3、配置拦截器

<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd ">

    <!-- 1、注解驱动  -->
    <mvc:annotation-driven/>
    <!-- 2、静态资源过滤  -->
    <mvc:default-servlet-handler/>
    <!-- 3、扫描包 -->
    <context:component-scan base-package="com.wei.controller"/>
    <!-- 4、视图接解析器  -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
   <mvc:interceptors>
       <mvc:interceptor>
           <mvc:mapping path="/admin/**"/> <!-- 要拦截的请求 -->
           <mvc:exclude-mapping path="/adminLogin"/>   <!-- 放行的请求 -->
           <mvc:exclude-mapping path="/login"/>	<!-- 放行的请求 -->
           <bean class="com.wei.config.MyInterceptor"/>
       </mvc:interceptor>
   </mvc:interceptors>
</beans>

4、登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1>登录</h1>
        <form method="post" action="/adminLogin">
            <input type="text" name="name"/>
            <input type="pwd" name="pwd"/>
            <input type="submit" value="确定">
        </form>
  </body>
</html>

5、后台页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
       <h1>后台首页</h1>
  </body>
</html>

6、前端首页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1>前端首页</h1>
  </body>
</html>

小结:最运行的结果就是访问/admin、如果没有登录就去登录页面啊、如果登录成功就去后台页面、在次访问也是后台页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值