SpringMVC拦截器的使用

30 篇文章 1 订阅
6 篇文章 0 订阅

一、什么是拦截器:

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 渲染了对应的视图之后执行,可用于清理资源。

 

四、代码如下:

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值