zoukankan      html  css  js  c++  java
  • SpringMVC-拦截器

    拦截器

    1. 过滤器与拦截器的区别

    拦截器是AOP思想的具体应用。

    过滤器

    • servlet规范中的一部分,任何java web工程都可以使用
    • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

    拦截器

    • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
    • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

    2. 自定义拦截器

    1. 编写拦截器

    拦截器要实现HandlerInterceptor接口

    package com.wang.config;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
    
        //return true;  执行下一个执行器, 放行
        @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("===============================清理==============================");
        }
    }
    

    2. 在Spring中配置拦截器

    <?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">
    
        <context:component-scan base-package="com.wang.controller"/>
    
        <mvc:annotation-driven/>
        <mvc:default-servlet-handler/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <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>
    
        <!--拦截器配置-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--包括这个请求下面的所有请求(/**)-->
                <mvc:mapping path="/**"/>
                <bean class="com.wang.config.MyInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
    
    </beans>
    

    3. 在controller使用拦截器

    package com.wang.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
    
        @GetMapping("/t1")
        public String test() {
            System.out.println("TestController ==> test() 已执行");
            return "OK";
        }
    }
    

    3. 利用拦截器做用户登录验证

    1. 编写前端

    1. 登录页面

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

    2. 首页

    <%--
      Created by IntelliJ IDEA.
      User: Wang
      Date: 2020/9/11
      Time: 15:51
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>首页</title>
    </head>
    <body>
    
    <h1>首页</h1>
    
    <span>${username}</span>
    
    <p>
        <a href="${pageContext.request.contextPath}/user/goOut">注销</a>
    </p>
    
    </body>
    </html>
    

    3. 启动页

    <%--
      Created by IntelliJ IDEA.
      User: Wang
      Date: 2020/9/11
      Time: 15:28
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>默认页面</title>
      </head>
      <body>
      <a href="${pageContext.request.contextPath}/user/goLoginPage">登录页面</a>
    
      <a href="${pageContext.request.contextPath}/user/goMainPage">首页</a>
      </body>
    </html>
    

    2. 编写controller

    package com.wang.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 {
    
        //跳转到login
        @RequestMapping("/goLoginPage")
        public String loginPage() {
            return "login";
        }
    
        @RequestMapping("/login")
        public String login(String username, String password, HttpSession session, Model model) {
            //把用户的信息保存在session中
            session.setAttribute("userLoginInfo", username);
    
            model.addAttribute("username", username);
            return "main";
        }
    
        //跳转到main
        @RequestMapping("/goMainPage")
        public String mainPage() {
            return "main";
        }
    
        //注销
        @RequestMapping("/goOut")
        public String goOut(HttpSession session) {
            //移除节点
            session.removeAttribute("userLoginInfo");
            return "main";
        }
    }
    

    3. 编写拦截器

    package com.wang.config;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class LoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            HttpSession session = request.getSession();
            //放行 : 判断什么情况下登录
            //session中存在用户信息的时候放行
            if (session.getAttribute("userLoginInfo") != null) {
                return true;
            }
            //在登录页面的时候也放行
            if (request.getRequestURI().contains("goLogin")) {
                return true;
            }
    
            //第一次登录也是没有session的, 此时也要放行
            //包含login,说明正在登录
            if (request.getRequestURI().contains("login")) {
                return true;
            }
    
    
            //判断什么情况下没有登录
            //不在登录页或者没有登录的, 转发到登录页面
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            return false;
        }
    }
    

    4. 配置拦截器

    <?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">
    
        <context:component-scan base-package="com.wang.controller"/>
    
        <mvc:annotation-driven/>
        <mvc:default-servlet-handler/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <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>
    
        <!--拦截器配置-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/user/**"/>
                <bean class="com.wang.config.LoginInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
    
    </beans>
    
  • 相关阅读:
    弱省胡策 Magic
    CF917D Stranger Trees
    【弱省胡策】Round #5 Count
    【BZOJ2117】 [2010国家集训队]Crash的旅游计划
    「2017 山东一轮集训 Day5」苹果树
    【SDOI2017】天才黑客
    【JXOI2018】守卫
    小程序两种图片加载方式
    小程序之底部栏设计
    小程序之全局变量的设置及使用
  • 原文地址:https://www.cnblogs.com/wang-sky/p/13653003.html
Copyright © 2011-2022 走看看