添加一个登录的拦截器(登录检验)

在login.html页面上,我们通过form表单把post请求给到我们的控制层;

<section class="loginCont">
        <!--在这个form表单之上我们添加一个if表达式,当其登录失误的时候对其进行处理-->
        <div th:if="${not #strings.isEmpty(msg)}"
        th:text="${msg}"
        style="color:red; margin-left: 130px"> <!--这里的话对控制层打印出的错误信息进行显示-->
        </div>
        <!--我们这里的话对login表单进行处理,提交一个login请求,把控制权交给控制器进行处理-->
        <form class="loginForm" th:action="@{/login}" th:method="post">

故我们在这里要写一个登录页面的控制层;

@Controller
public class LoginController {
    //这里以post方式提交,我们在html上的请求就会被提交到这里进行处理
    @PostMapping("/login")
    public String login(HttpSession session,
                        @RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String, Object> map) {
        if (!StringUtils.isEmpty(username) && "123".equals(password)) {
            //如果登录成功的话就进入到该if中,然后我们把该用户名保存到session中,
            // 然后我们到拦截器中对其进行获取
            session.setAttribute("username",username);
            //登录成功,防止表单重复提交,通过重定向到主页,需要添加一个视图
            return "redirect:/main.html";//这里相当于接收一个请求路径:到main路径下找html
        }
        //登录失败:我们把该字段写入到msg这个map中
        map.put("msg", "用户名或者是密码错误");
        return "/main/login";
    }
}

并且给其注册一个拦截器:编写一个LoginHandlerInterceptor类让其去实现HandlerInterceptor接口,并且实现里面的方法preHandle

  package com.siter.springboot01bill.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 这里写一个登录拦截器:然后实现一个拦截器接口,实现一下里面的方法
 * 这里只是注册一个拦截器,并没有对其进行添加到容器中
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {

    /**
     * 调用目标方法之前被拦截:
     * 就是通过session中有没有用户名来判断是否有登录过,
     * 未登录过就进行拦截,
     * 故我们在登录的控制层对其进行一个登录名的获取
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //这里我们先用request对象获取到session,然后再获取到session中(getAttribute)保存好的值
        Object loginUser = request.getSession().getAttribute("username");
        if (loginUser!=null){
            //如果获取到的loginUser对象不为空,故已经进行了登录,故放行
            return true;
        }
        /**没有进行登录的话我们需要对其进行提示,
        并为其转发到登录页面(之所以选择转发的话,是因为转发可以带信息,重定向的话是直接修改了url地址)
         */
        //这里选择把信息也绑定到msg,到时候统一进行提示;
        request.setAttribute("msg","未登录,请先进行登录~");
        request.getRequestDispatcher("/index.html").forward(request,response);
        return false;
    }
}

然后我们需要继续在springMVCconfig中将该拦截器注入到容器中;并指定该拦截的请求以及我们不应该拦截的请求:在WebMvcConfigurer该类中我们ctrl+o,选择重写addInterceptors方法;如下:

package com.siter.springboot01bill.config;

import com.siter.springboot01bill.component.MyLocalResolver;
import com.siter.springboot01bill.interceptor.LoginHandlerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 我们使用该类来进行跳转到首页:让其访问localhost:8080就能进入首页
 */
@Configuration
public class MySpringMvcConfig {
    @Bean  //这里得注意加bean注入到容器中
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override //这里添加一个视图控制器,用来跳转到我们定制的首页
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("main/login");
                registry.addViewController("/index.html").setViewName("main/login");
                //通过执行的url跳转到指定的页面
                registry.addViewController("/main.html").setViewName("main/index");


            }
            //刚才只是定义了一个拦截器,然后我们这里把其装入到容器中
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new LoginHandlerInterceptor())
                        //指定要拦截的请求:/**表示拦截所有请求
                        .addPathPatterns("/**")
                        //排除不需要拦截的请求
                        .excludePathPatterns("/index.html","/login","/")
                        //springboot2.0之后我们需要对静态文件路径手动进行排除~
                        .excludePathPatterns("/css/*","/img/*","/js/*");

            }
        };
    }

    //需要替换MVC自动配置类中区域解析器
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocalResolver();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用 Spring Boot 写一个登录拦截器的步骤: 1. 创建一个实现了 HandlerInterceptor 接口的类,例如 LoginInterceptor。 ```java public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在此处编写登录拦截逻辑 return true; // 返回 true 表示继续执行请求 } // 可以在此处实现 afterCompletion 和 postHandle 方法 } ``` 2. 在该类中实现 preHandle 方法,该方法在请求处理之前被调用。在该方法中,可以编写登录拦截的逻辑,例如判断用户是否已登录,如果未登录则重定向到登录页面。如果已登录则返回 true,表示请求可以继续执行。 3. 在 Spring Boot 的配置类中注册该拦截器。 ```java @Configuration public class AppConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); // 添加拦截器,并指定拦截路径 } } ``` 4. 在注册拦截器的时候,可以使用 addPathPatterns 方法指定该拦截器需要拦截的路径,例如上面的例子中指定了拦截所有路径。 5. 最后,在需要进行登录拦截的控制器方法上添加 @LoginRequired 注解,这个注解可以自定义实现,用于标记需要登录才能访问的接口。 ```java @RestController public class UserController { @RequestMapping("/user/info") @LoginRequired // 标记该接口需要登录才能访问 public String getUserInfo() { // 在此处编写获取用户信息的逻辑 return "User Info"; } } ``` 这样,当用户访问 /user/info 接口时,如果未登录则会被重定向到登录页面,如果已登录则会返回用户信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值