SpringBoot自定义拦截器的实现

有时候我们登录网页如淘宝、京东,我们如果没登陆点击购买商品的话,界面将会跳转到登录页/注册页让我们先进行登录/注册,这里面就用到了拦截器,阻止我们没登陆时进行操作。

一、 控制器处理请求

  1. 先创建一个login.html和success.html,login.html用来登录,success.html表示成功后跳转的页面,也是需要拦截的界面。
	<!--login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/check" method="post">
    id:<input type="text" name="id">
    name:<input type="text" name="name">
    <input type="submit" value="提交">
</form>
</body>
</html>
**********************************************************
	<!--success.html,使用thymeleaf获取值-->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    登陆成功!欢迎你:<span th:text="${session.person.getName()}"/>
</body>
</html>

2.创建控制器用来处理请求

package com.yhr.boot04.controller;

import com.yhr.boot04.bean.Person;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpSession;

@Controller
public class IndexController {
	//登录页
    @GetMapping(value = {"/","/login"})
    public String login(){
        return "login";
    }
	//校验数据
    @PostMapping(value = "/check")
    public String successPage(Person person,HttpSession session){
        if (StringUtils.hasLength(person.getName()) && StringUtils.hasLength(person.getId())){
            session.setAttribute("person",person);//确保id和name不为空,放入session域中。
            return "redirect:/success.html";
        }else {
            return "login";//为空继续保留在登录页
        }
    }
	//成功页
    @GetMapping(value = "/success.html")
    public String success(){
        return "success";
    }
}

二、 创建拦截器拦截请求

package com.yhr.boot04.interceptor;

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor{
    //拦截之前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Object person = session.getAttribute("person");//获取登录页拿到的值
        if (person != null){
            return true;//有值就能跳入success.html
        }
        response.sendRedirect("login");//session中的person如果为空就重新重定向跳回登录页
//        request.getRequestDispatcher("login").forward(request,response);
        System.out.println("登陆失败");
        return false;
    }

    //拦截之后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

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

三、 配置拦截器

在我的项目中需要拦截success.html,其余的放行即可

package com.yhr.boot04.config;

import com.yhr.boot04.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {//注册拦截器
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")//全部拦截
                .excludePathPatterns("/","/check","/login");//放行这些请求
    }
}

四、 测试

  1. 登录页:
    在这里插入图片描述

  1. 如果想直接去成功页就会被拦截,并在控制台打印错误信息。
    在这里插入图片描述

在这里插入图片描述


  1. 输入正确信息

在这里插入图片描述
显示页面:
在这里插入图片描述
成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值