加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

SpringMVC-拦截器

发布时间:2020-12-15 01:15:47 所属栏目:大数据 来源:网络整理
导读:拦截器 目录 拦截器 1. 过滤器与拦截器的区别 2. 自定义拦截器 1. 编写拦截器 2. 在Spring中配置拦截器 3. 在controller使用拦截器 3. 利用拦截器做用户登录验证 1. 编写前端 1. 登录页面 2. 首页 3. 启动页 2. 编写controller 3. 编写拦截器 4. 配置拦截器

拦截器

目录
  • 拦截器
    • 1. 过滤器与拦截器的区别
    • 2. 自定义拦截器
      • 1. 编写拦截器
      • 2. 在Spring中配置拦截器
      • 3. 在controller使用拦截器
    • 3. 利用拦截器做用户登录验证
      • 1. 编写前端
        • 1. 登录页面
        • 2. 首页
        • 3. 启动页
      • 2. 编写controller
      • 3. 编写拦截器
      • 4. 配置拦截器

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,Object handler,ModelAndView modelAndView) throws Exception {
        System.out.println("===============================处理后==============================");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,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,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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读