springboot中通过拦截器实现用户登录

开始是通过过滤器来实现这个功能的,但是发现通过过滤器实现,后续有许多延伸的问题需要去解决,比较麻烦,于是改成通过拦截器来实现。

过滤器和拦截器区别

那么过滤器和拦截器有什么根本的区别呢?
 
 	①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
 	②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
 	③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
 	④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
 	⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
 	⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
 	这个是从网上摘抄的几点过滤器和拦截器的区别。
 	
 	至于登录功能在这里使用了拦截器的原因我认为主要是第三点,拦截器只针对于action请求,而过滤器针对于所有的请求。
 	所以在对静态资源的请求处理时过滤器需要额外的去做很多工作。

WebMVC配置


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;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class SpringMvcConfig  extends WebMvcConfigurerAdapter {
	//移除不需要拦截的路径
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String[] excludes={"/","/loginAdmin","/login","/static/**"};
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns(excludes);
    }
	//设置默认跳转的页面
    @Override
    public void addViewControllers(ViewControllerRegistry viewControllerRegistry) {
        viewControllerRegistry.addViewController("/").setViewName("/login");
    }
}

登录拦截器

import org.omg.PortableInterceptor.Interceptor;
import org.springframework.stereotype.Component;
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;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        HttpSession httpSession=httpServletRequest.getSession();

        String adminUserName =httpSession.getAttribute("ADMIN_USER_NAME")+"";
        if("null".equals(adminUserName)){
            httpServletRequest.getRequestDispatcher("/login").forward(httpServletRequest, httpServletResponse);
            return false;
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

以上就是通过拦截器实现登录的全部实现。

 	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值