自定义登录拦截器


自定义登录拦截器

1. 设置会话 loginUser 属性

package com.allen.controller;

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

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Model model,
                        HttpSession session){

        if(!StringUtils.isEmpty(username) && "123".equals(password)){

            session.setAttribute("loginUser",username);
            //重定向到主页,main.html 跳转到视图 dashboard.html
            return "redirect:/main.html";
        }else{
            model.addAttribute("msg","username or password is incorrect");
            return "index";
        }
    }

    @RequestMapping("/user/logout")
    public String userLogout(HttpSession session){
        session.invalidate();
        return "redirect:/index.html";
    }
}

2.编写自定义拦截器,根据 loginUser 属性判断是否放行

package com.allen.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

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

/**
 * @author Allen
 * @date 2020/12/23 17:02
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        Object loginUser = request.getSession().getAttribute("loginUser");
        if(loginUser==null){    //没有用户名
            request.setAttribute("msg","please sign in");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }
        return true;    //放行
    }
}

3.注册拦截器,并根据项目设置拦截路径

项目目录如下

  • addPathPatterns():拦截所选路径
  • excludePathPatterns():不拦截所选路径
package com.allen.config;

import com.allen.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;

/**
 * @author Allen
 * @date 2020/12/22 20:17
 */
@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");
    }

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

    //拦截器生效
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").
                excludePathPatterns("/index.html","/","/user/login","/css/*","/img/*","/js/*");
    }
}

文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录