Spring拦截器实现登录拦截

   hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容。昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题。
   说起拦截器不得先说说过滤器,接下来我们先说说过滤器和拦截器的区别吧。

一、拦截器与过滤器区别

1、作用域差异:

   Filter是Servlet规范中规定的,只能用于web中;拦截器既可以用于web中,也可以用在Application中等等

2、规范差异:

   Filter是Servlet规范中定义的,是Servlet容器支持的;拦截器是Spring容器内的,是Spring框架支持的。

3、资源差异:

   拦截器是Spring的一个组件,可以使用Spring框架中的任何资源和对象,而Filter则不可以进行访问。

4、深度差异:

   Filter只能在Servlet的前后起作用,而拦截器可以深入到方法的前后、异常抛出前后等更深层次的程度处理。因此在Spring框架中优先使用拦截器。

二、拦截器实现

1、定义拦截器:

首先我们来进行配置好我们的拦截器,实现HandlerInterceptor接口,然后重写preHandle方法,代码如下图所示:

package com.kuang.config;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

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

/**
 * @author ygl
 * @description
 * @date 2020/10/27 18:19
 */
@Component
public class LoginHandlerInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //登录成功之后,应该有session
        Object loginUser = request.getSession().getAttribute("loginUser");
        if (loginUser == null){
            //说明没有登录
            request.setAttribute("msg","对不起,你没有权限,请先登录!");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }else {
            return true;
        }
    }
}

   preHandle()是在Controller接口中的方法执行之前进行调用,如果返回为true,则说明Controller方法可以执行,返回为False则不能执行。我这里采用的是取出session中loginUser的值,如果不为空,则说明登录了,如果为空,则说明未登录,直接进行拦截,并返回前端说没有权限且同时重定向到登录页面。

2、注册拦截器:

   定义好拦截器后进行注册拦截器,先实现WebMvcConfigurer接口,进行重写addInterceptors()方法,注册拦截器代码如下图所示:

package com.kuang.config;

import org.springframework.beans.factory.annotation.Autowired;
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.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author ygl
 * @description
 * @date 2020/10/26 15:45
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
           registry.addViewController("/").setViewName("index");
           registry.addViewController("/index.html").setViewName("index");
           registry.addViewController("/main.html").setViewName("dashboard");
    }
//    @Autowired
//    private LoginHandlerInterceptor loginHandlerInterceptor;

    //自定义国际化就生效了
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }

    //注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	//括号内的对象是new出来的,可以交给Spring框架中的IOC容器进行管理,也就是采用注解:@Autowried进行注入
        registry.addInterceptor(new LoginHandlerInterceptor())
        		//对所有的进行拦截,包括静态资源
                .addPathPatterns("/**")
                //除去/index.html  /    /user/login  /css/**   /img/**   /js/**这些不进行拦截
                .excludePathPatterns("/index.html","/","/user/login","/css/**","/img/**","/js/**");
    }
}

   .addPathPatterns()是对那些路径进行拦截,excludePathPatterns方法是除去那些不进行拦截。

3、登录Controller类:

   登录类代码如下图所示:

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpSession;

/**
 * @author ygl
 * @description
 * @date 2020/10/27 17:35
 */
@Controller
public class LoginController {

    /**
     * @author ygl
     * @date 2020-10-27 17:37
    */
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model, HttpSession session){
        if (!StringUtils.isEmpty(username) && "123456".equals(password)){
            session.setAttribute("loginUser",username);
            return "redirect:/main.html";
        }else {
            model.addAttribute("msg","用户名或者密码错误");
            return "index";
        }

    }

}

   这里验证用户名和密码是模拟的,在实际开发过程中要进行进数据库中实际查询和验证,当用户名和密码验证成功后进行给session设定值,记录登录成功,并且进行重定向至主页,如果验证失败,则重新返回至登录页面。
   最后给大家放个类应该所存放的包:
在这里插入图片描述
   好了,今天的分享到此结束。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Security中,可以使用Filter来实现自定义的登录认证拦截器。具体步骤如下: 1. 创建一个实现javax.servlet.Filter接口的拦截器类,例如:CustomAuthenticationFilter。 ```java public class CustomAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 获取请求中的用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); // 自定义认证逻辑 if ("admin".equals(username) && "admin".equals(password)) { // 认证通过 filterChain.doFilter(request, response); } else { // 认证失败 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } } } ``` 2. 在Security配置类中配置该拦截器。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.addFilterBefore(new CustomAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } } ``` 在上面的配置中,我们将自定义的拦截器添加到了UsernamePasswordAuthenticationFilter之前,这样就可以在登录认证之前进行自定义认证逻辑的处理。 3. 在登录页面中提交用户名和密码的表单。 ```html <form action="/login" method="post"> <div> <label>用户名:</label> <input type="text" name="username"/> </div> <div> <label>密码:</label> <input type="password" name="password"/> </div> <div> <input type="submit" value="登录"/> </div> </form> ``` 当用户提交表单时,自定义的拦截器拦截请求并进行自定义认证逻辑的处理,如果认证通过,则继续执行后续的请求处理流程,否则返回认证失败的状态码。 以上就是使用Filter实现登录认证的步骤。需要注意的是,这种方式只适用于简单的认证场景,对于更为复杂的认证需求,建议使用Spring Security提供的AuthenticationProvider进行认证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岭岭颖颖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值