Springboot使用sendDireact实现的拦截器只允许访问登录注册页面

本文分享了在SpringBoot项目中实现登录页面拦截的具体方法,采用Session原理,详细介绍了自定义Interceptor类及WebConfig配置,确保只有已登录用户才能访问特定页面。

今天在做springboot登录页面的拦截器时积累了一些经验,使用的是session原理。

####话不多说,直接上代码
拦截器的结构如图所示
###首先定义Interceptor类

package com.example.demo.Interceptor;


import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashSet;
import java.util.Set;

@Controller
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                              Object handler)throws Exception {
        String basePath = request.getContextPath();
        String path = request.getRequestURI();
        if(!doLoginInterceptor(path, basePath) ){//是否进行登陆拦截
            return true;
        }
        HttpSession session = request.getSession(true);
        //获取登录时设置的session
        Object username = session.getAttribute("userName");
        if (null == username) {
            String requestType = request.getHeader("X-Requested-With");
//			System.out.println(requestType);
            if(requestType!=null && requestType.equals("XMLHttpRequest")){
                response.setHeader("sessionstatus","timeout");
//				response.setHeader("basePath",request.getContextPath());
                response.getWriter().print("LoginTimeout");
                return false;
            } else {
            //页面重定向到登录页面
              response.sendRedirect(request.getContextPath()+"/login.html");
            }
            return false;
        }
        return true;
    }

    /**
     * 是否进行登陆过滤
     * @param path
     * @param basePath
     * @return
     */
    private boolean doLoginInterceptor(String path,String basePath) {
        path = path.substring(basePath.length());
        Set<String> notLoginPaths = new HashSet<>();
        //设置不进行登录拦截的路径:登录注册
        notLoginPaths.add("/login");
        notLoginPaths.add("/register");
        notLoginPaths.add("/img");
        return !notLoginPaths.contains(path);
    }

}

###然后写WebConfig类
WebMvcConfigurerAdapter这个方法目前已经不是推荐方法

package com.example.demo.Interceptor;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    LoginInterceptor loginInterceptor;
    //这里设置的是未登录也不拦截的静态资源,注意接口也会被拦截
    final String[] notLoginInterceptPaths = {"/login.html", "/login.css", "/login.js", "/register.html", "/register.css", "register.js", "/img/**","/superadmin/**"};

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        
        // 登录拦截器

        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(notLoginInterceptPaths);
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/templates/");
        resolver.setSuffix(".html");
        resolver.setViewClass(JstlView.class);
        return resolver;

    }
}

####最后总结一下,过滤器和拦截器都可以实现页面的跳转,也可以通过respose.getWriter().print()的方法写js来进行页面的跳转。然后对于接口会被拦截,过滤这个问题需要注意一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值