2022.7.30 拦截器

拦截器

 

 

拦截器概述

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

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

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用

  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用

  • 拦截器只会拦截访问的控制器方法(controller请求), 如果访问的是jsp/html/css/image/js是不会进行拦截的

 

自定义拦截器

那如何实现拦截器呢?

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

1、新建一个Moudule , springmvc-07-Interceptor , 添加web支持

2、配置web.xml 和 applicationContext.xml 文件

3、添加lib目录,配置tomcat

4、编写一个拦截器

MyInterceptor

 package com.xing.config;
 
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 /**
  * @program: SpringMVC
  * @Date: 2022/07/29
  * @author: 16159
  * @description:
  * @Modified By:
  **/
 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、在applicationContext.xml的配置文件中配置拦截器

 <?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: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
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
 
     <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
     <context:component-scan base-package="com.xing.controller"/>
 
     <!--静态资源过滤 不配置的话,js加载不进去-->
     <mvc:default-servlet-handler/>
 
     <!--json乱码统一解决-->
     <mvc:annotation-driven>
         <mvc:message-converters register-defaults="true">
             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                 <constructor-arg value="UTF-8"/>
             </bean>
             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                 <property name="objectMapper">
                     <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                         <property name="failOnEmptyBeans" value="false"/>
                     </bean>
                 </property>
             </bean>
         </mvc:message-converters>
     </mvc:annotation-driven>
 
     <!-- 视图解析器 -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
           id="internalResourceViewResolver">
         <!-- 前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/" />
         <!-- 后缀 -->
         <property name="suffix" value=".jsp" />
     </bean>
 
     <!--拦截器配置-->
     <mvc:interceptors>
         <mvc:interceptor>
             <!--/只过滤当前当前这一个请求-->
             <!--/** 拦截所有请求-->
             <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
             <!--/admin/** 拦截的是/admin/下的所有请求 -->
             <mvc:mapping path="/**"/>
             <!--bean配置的就是拦截器 (通过哪个类拦截)-->
             <bean class="com.xing.config.MyInterceptor"/>
         </mvc:interceptor>
     </mvc:interceptors>
 
 </beans>

5、编写一个Controller,接收请求

 package com.xing.controller;
 
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 //测试拦截器的控制器
 @RestController
 public class InterceptorController {
 
    @RequestMapping("/t1")
    public String testFunction() {
        System.out.println("控制器中的方法执行了");
        return "hello";
  }
 }

6、前端 index.jsp

 
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
   <head>
     <title>拦截器</title>
   </head>
   <body>
    <%--跳转到t1请求--%>
     <a href="${pageContext.request.contextPath}/t1">拦截器测试</a>
   </body>
 </html>
 

7、启动tomcat 测试一下!

 

 

 

 

 

 

 

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

实现思路

1、有一个登陆页面,需要写一个controller访问页面。

2、登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。

3、拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面

测试:

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

 <%--
   Created by IntelliJ IDEA.
   User: 16159
   Date: 2022/7/30
   Time: 10:51
   To change this template use File | Settings | File Templates.
 --%>
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Title</title>
 </head>
 
 <%--在WEB-INF下的所有页面或者资源,只能通过controller或者servlet进行访问--%>
 <h1>登录页面</h1>
 <hr>
 
 <body>
 
     <form action="${pageContext.request.contextPath}/user/login" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="pwd"> <br>
         <input type="submit" value="提交">
     </form>
 
 </body>
 
 </html>
 

2、编写一个Controller处理请求 LoginController

 package com.xing.controller;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import javax.servlet.http.HttpSession;
 
 @Controller //走视图解析器
 @RequestMapping("/user")
 public class LoginController {
 
    //跳转到首页
    @RequestMapping("/main")
    public String main(){
        return "success";
  }
 
    //跳转到登录页面
    @RequestMapping("/goLogin")
    public String goLogin(){
        return "login";
  }
 
    //登陆 登录成功进入首页
    @RequestMapping("/login")
    public String login(HttpSession session, String username, String pwd, Model model){
        // 把用户信息存入session
        session.setAttribute("userLoginInfo", username);
        model.addAttribute("user", username);
        return "success";
  }
 
    //退出登陆
    @RequestMapping("logout")
    public String logout(HttpSession session){
        // 移除session
        session.removeAttribute("userLoginInfo");
        return "success";
  }
 }

3、编写一个登陆成功的页面 success.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>首页</title>
 </head>
 <body>
     <h1>首页</h1>
    <%--接收model传来的值--%>
     <span>${user}</span>
     <br/>
     <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>
   </head>
   <body>
    <%--跳转到t1请求--%>
     <a href="${pageContext.request.contextPath}/t1">拦截器测试</a>
     <br/>
     <a href="${pageContext.request.contextPath}/user/goLogin">登录页面</a>
     <a href="${pageContext.request.contextPath}/user/main">首页</a>
   </body>
 </html>
 

5、编写用户登录拦截器 LoginInterceptor

 package com.xing.config;
 
 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 {
        // 如果是登陆页面则放行   这个url请求中只要包含login(模糊查询)就放行
        if (request.getRequestURI().contains("login")) {
            return true;
      }
 
        HttpSession session = request.getSession();
 
        // 如果用户登陆过也放行 (session中的用户信息)
        if(session.getAttribute("userLoginInfo") != 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的配置文件中注册拦截器

 <?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: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
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
 
     <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
     <context:component-scan base-package="com.xing.controller"/>
 
     <!--静态资源过滤 不配置的话,js加载不进去-->
     <mvc:default-servlet-handler/>
 
     <!--json乱码统一解决-->
     <mvc:annotation-driven>
         <mvc:message-converters register-defaults="true">
             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                 <constructor-arg value="UTF-8"/>
             </bean>
             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                 <property name="objectMapper">
                     <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                         <property name="failOnEmptyBeans" value="false"/>
                     </bean>
                 </property>
             </bean>
         </mvc:message-converters>
     </mvc:annotation-driven>
 
     <!-- 视图解析器 -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
           id="internalResourceViewResolver">
         <!-- 前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/" />
         <!-- 后缀 -->
         <property name="suffix" value=".jsp" />
     </bean>
 
     <!--拦截器配置-->
     <mvc:interceptors>
         <mvc:interceptor>
             <!--/只过滤当前当前这一个请求-->
             <!--/** 拦截所有请求-->
             <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
             <!--/admin/** 拦截的是/admin/下的所有请求 -->
             <mvc:mapping path="/**"/>
             <!--bean配置的就是拦截器 (通过哪个类拦截)-->
             <bean class="com.xing.config.MyInterceptor"/>
         </mvc:interceptor>
 
  <!--登录拦截器配置-->
         <mvc:interceptor>
             <mvc:mapping path="/user/**"/>
             <bean id="loginInterceptor" class="com.xing.config.LoginInterceptor"/>
         </mvc:interceptor>
 
     </mvc:interceptors>
 
 </beans>

7、再次重启Tomcat测试!

posted @ 2022-07-30 22:05  暴躁C语言  阅读(68)  评论(0)    收藏  举报