欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC拦截器的使用

程序员文章站 2022-07-09 18:10:55
...

一、什么是拦截器:

Java里的拦截器是动态拦截action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作

 

二、为什么要使用拦截器:

如果具有这样一个需求,就是用户未登陆的拦截等,我们可以使用springmvc的拦截器为我们做到。实现接口HandlerInterceptor接口,需要实现3个方法

 

三、需要实现的3个方法:

preHandler :控制器方法执行前调用, 是controller的前置方法,当方法返回false整个请求就结束了。多个Interceptor,然后        SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在。

postHandle : 执行控制器方法后,渲染视图之前调用。就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用。

afterHandler: 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,可用于清理资源。

 

四、代码如下:

SpringMVC拦截器的使用

 

1、com.ht.bean/User.java 

package com.ht.bean;

/**
 * Created by Administrator on 2019/3/1.
 */
public class User {
    private  int id;
    private String uname;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 

2、com.ht.controller/UserController.java

package com.ht.controller;

import com.ht.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

/**
 * Created by Administrator on 2019/2/28.
 */
@Controller  //表示这是一个控制层
@RequestMapping("/user")  //全局的访问路径
public class UserController {

    //该方法的访问路径为http://localhost:8080/SpringMVC_T03/user/login  

    @RequestMapping("login")  //单个方法的访问路径
    public String login(HttpSession session){
        User user=new User();
        user.setId(1000);
        user.setUname("张三");
        user.setPassword("111");
        session.setAttribute("user",user);
        return "hello";
    }

   @RequestMapping("/test")
    public String test(){
       System.out.println("连接一进来了");
       return "hello";
    }



}

 

3、com.ht.interceptors/LoginInterceptor.java

package com.ht.interceptors;

import com.ht.bean.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by Administrator on 2019/3/1.
 */
public class LoginInterceptor  implements HandlerInterceptor{

    //设置白名单URL  //登录和注册的方法的url
    private static final String[] IGNORE_URI ={"/user/login","/user/register"};

    /*
    * 控制器方法执行前调用
    * */
    @Override //1
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //获取当前访问路径
        String url = request.getRequestURI();
        System.out.println("访问路径  + url");
        boolean flag = false;
        //判断请求路径是否白名单中路径
        for (String s : IGNORE_URI) {
            if (url.contains(s)) {//如果访问路径是白名单
                flag = true;
                break;
            }
        }

        if (!flag) {//不是在白名单的路径
            User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                System.out.println("还没有登录。。");
                response.sendRedirect("/SpringMVC_T03/login.jsp");
                return false; //表示不再往下执行
            }
        }
            System.out.println("已经登录了");
            return true;
    }

    /*
    * 执行控制器方法后,渲染视图之前
    * */
    @Override  //2
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle 跳转的视图的名称:" +modelAndView.getViewName());
        //System.out.println(modelAndView.getModelMap().get(""));
    }


    /*
    * 方法执行完毕后(视图渲染后)
    * */
    @Override  //3
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println("拦截器结束");
    }
}

4、config/spring-web.xml

<beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
                xmlns:context="http://www.springframework.org/schema/context"
                xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!--1、开启注解模式-->
<mvc:annotation-driven/>
<!--2、配置默认servlet处理器-->
<mvc:default-servlet-handler/>

<!--配置WEB-INF下面的资源可以访问-->
<!--   <mvc:resources mapping="/css/**" location="/WEB-INF/css/"></mvc:resources>-->
<!--<mvc:resources mapping="/js/**" location="/WEB-INF/js/"></mvc:resources>
-->
<!--3、视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!--4、扫描所有的控制器类-->
<context:component-scan base-package="com.ht.controller"/>

    <!--配置拦截器
     //  /**表示拦截器所有的控制器请求   /user/**  拦截user下的所有请求
    -->
    <mvc:interceptors>
         <mvc:interceptor>
             <mvc:mapping path="/**"/>
             <bean class="com.ht.interceptors.LoginInterceptor"/>
         </mvc:interceptor>
    </mvc:interceptors>

</beans>

 

5、WEB-INF/jsp/hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
BBBBB成功进入hello界面,你好
</body>
</html>

6、WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:config/spring-web.xml</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

 

7、index.jsp

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

  <a href="user/test">连接一</a>

  </body>
</html>

8、login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

这是登录界面
<a href="user/login">登录</a>

</body>
</html>

注:操作说明:

先进入index.jsp,然后点击 “连接一” 这个超链接,由于配置了拦截器,所以会拦截未登录前的一切操作,会在控制台打印还未登录,直接跳转到登陆界面,然后点击登陆,登录之后就可以进入连接一了