SpringMVC 通过实现HandlerInterceptor接口 实现拦截器功能

定义一个类实现HandlerInterceptor

package cn.liziy.interceptors;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;


public class LoginInterceptor implements HandlerInterceptor {

    private static final Log logger = LogFactory.getLog(UserLoginInterceptor.class);

    private List<String> exceptUrls;

    public List<String> getExceptUrls() {
        return exceptUrls;
    }

    public void setExceptUrls(List<String> exceptUrls) {
        this.exceptUrls = exceptUrls;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入preHandle");
        //flag 用于判断用户是否登录,默认为false
        boolean flag = false;
        //获取请求的路径进行判断
        String servletPath = request.getServletPath();
        System.out.println("获取到的URL "+servletPath);
        //过滤不需要拦截的页面
        for(String s : exceptUrls){
            if(servletPath.contains(s)){
                flag = true;
                break;
            }
        }
        //当页面被拦截时进入
        if(!flag){
           
        }
        System.out.println("是否允许通过 "+flag);
        return flag;
    }

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

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

在applicationContext.xml 配置interceptors,设置不拦截的请求

<mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截所有请求 -->
            <mvc:mapping path="/**" />
            <!-- 之间创建的拦截器类 -->
            <bean class="cn.liziy.interceptors.LoginInterceptor">
                <property name="exceptUrls">
                    <list>
                        <!-- 配置不拦截的请求 -->
                        <value>/index</value>
                        <value>/login</value>
                        <value>/user/login</value>
                        <value>/register</value>
                        <value>/user/register</value>
                    </list>
                </property>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>    

博主测试的时候 出现了前端js文件被拦截了

我的解决方法

在applicationContext.xml 中添加这段配置

<!--  放行静态资源 -->
    <mvc:default-servlet-handler/>

发现拦截器依旧拦截

第二种解决方案

在web.xml添加这段配置 位于DispatcherServlet前面

<?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-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
        <url-pattern>*.ico</url-pattern>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <!--配置DispatcherServlet-->
    <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:spring/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <!--默认匹配所有请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Controller 代码

package cn.liziy.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @ClassName LoginControllerWeb
 * @Author:Liziy
 * @Date 2020/5/11 19:46
 * @Description:
 **/
@Controller
public class LoginControllerWeb {

    @GetMapping("/register")
    public String toUserRegister(){
        return  "web/register";

    }

    @GetMapping("/login")
    public String toUserLogin(){
        return  "web/login";
    }

    @GetMapping("/web/welcome")
    public String toWelcome(){
        return  "web/welcome";
    }


}

 

posted @ 2020-06-01 14:02  火星的巧克力  阅读(726)  评论(0编辑  收藏  举报
/* 返回顶部代码 */ TOP