SpringBoot的拦截器使用

这里使用登录表单提交作为例子

1、导入的依赖以及依赖版本

<!--导入thymeleaf依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--thymeleaf的版本号-->
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>

2、创建表单提交页面和成功页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--引入thymeleaf的空间-->
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login" method="post">
        <table>
            <tr>
                <td>用户名</td>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>密码</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td></td>
                <td>
                    <input type="submit" value="登录">
                    <span th:text="${error}" th:if="${not #strings.isEmpty(error)}"></span>
                    <span th:text="${handlerInterceptorMessage}" th:if="${not #strings.isEmpty(handlerInterceptorMessage)}"></span>
                    <!--request域中的数据可以直接取出使用-->
                </td>
            </tr>
        </table>
    </form>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
[[${session.username}]]<!--session域中数据的使用方法-->
</body>
</html>

3、实现controller(两种写法,一种是没有重定向,所以会重复提交表单,一种是重定向,不会重复提交表单)如果打开了检查元素是不会看见重复提交表单的提示框的

package com.xjj.demo97003.controller;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class MyController {
    @RequestMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password, Map<String,Object> map, HttpSession httpSession){
        //当登陆结果不正确时,返回error,这里就没有重定向,所以会重复提交表单
        if(StringUtils.isEmpty(username)){
            map.put("error","用户名不能为空");
            return "login";
        }
        if(StringUtils.isEmpty(password)){
            map.put("error","密码不能为空");
            return "login";
        }
        if(!username.equals("123")||!password.equals("123")){
            map.put("error","账号或密码错误");
            return "login";
        }
        //为了防止表单重复的提交,只能够设置重定向的操作,但是重定向map就不能给信息,所以用session
        httpSession.setAttribute("username",username);
        //重定向到success.html的请求,而这个请求已经被拓展配置文件配好了,会直接跳到成功页面。否则只会被当作静态资源的访问请求,不会到找到templates文件夹里面自己想要的那个文件。
        return "redirect:/success.html";
    }
}

4、拓展springboot的配置和Interceptor的编写

package com.xjj.demo97003.config;

import com.xjj.demo97003.component.MyHandlerinterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//加上才能被SpringBoot读取
@Configuration
public class MyConfig implements WebMvcConfigurer {
    //注入到容器中
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() {
            @Override
            //写了这个才能实现对templates文件夹下面的页面的直线访问
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/login.html").setViewName("login");
                registry.addViewController("/success.html").setViewName("success");
            }
            //写了这个才能实现对某个请求的拦截功能
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new MyHandlerinterceptor()).addPathPatterns("/success.html");
            }
        };
        return webMvcConfigurer;
    }
}

package com.xjj.demo97003.component;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//用来创建自己的拦截器
public class MyHandlerinterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //通过session的值来判断是否要进行拦截
        Object username=request.getSession().getAttribute("username");
        if(username!=null){
            return true;
        }else{
            request.setAttribute("handlerInterceptorMessage","没有权限,请先登录");
            //当权限不够的时候直接跳回主页面
            request.getRequestDispatcher("/login.html").forward(request,response);
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值