1. 程式人生 > >springboot登入攔截器(簡單實用)

springboot登入攔截器(簡單實用)

專案使用的是idea開發工具,thymeleaf+springboot1.56(2.0版本也可以)+mybatis.現在需要寫一個攔截器,網上有很多,但是對於我這種小白有些地方看的不太明白,今天我來寫的詳細一些,廢話不多說開始(這裡攔截器沒有使用springWebSecurity框架,所以不用在maven中配置)

首先寫一個實體類,專案使用的是mybatis 所以可以自動生成。表的欄位其實很簡單

    private Long userNo;
    private Integer id;
    private String userName;
    private String password;
    private String nickName;
    private String role;

其中userName和password是必須的,其他的我專案需要用,你們可以不加。

然後寫一個攔截器配置類,繼承WebMvcConfigurerAdpter,其中SESSION_KEY可以隨便寫,登入的Controller類會呼叫它然後存到session中,SecurityInterceptor類會接收它,如果不為空就放行,否則跳轉到登入頁面。詳情請看下面程式碼

/**
 * Created by yStar on 2018/2/23 16:36:16
 * 攔截器配置
 */
@Configuration
public class WebSecurityConfig extends WebMvcConfigurerAdapter {

    public static final String SESSION_KEY="name";

    @Bean
    public SecurityInterceptor getSecurityInterceptor(){
        return  new SecurityInterceptor();
    }
    @Override
    public  void addInterceptors(InterceptorRegistry registry){
        InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());

        //排除配置
        addInterceptor.excludePathPatterns("/error");
        addInterceptor.excludePathPatterns("/login/**");
        addInterceptor.excludePathPatterns("/captcha");//排除驗證碼
        //攔截配置
        addInterceptor.addPathPatterns("/**/**");
    }

    private class SecurityInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws IOException{
            HttpSession session = request.getSession();

            //判斷是否已有該使用者登入的session
            if(session.getAttribute("account") !=null){
                return  true;
            }
            //跳轉到登入頁
            String url = "/art/login";
            response.sendRedirect(url);
            return false;
        }
    }

}
登入的Controller類
@Controller
public class helloController {

    @Autowired
    private SystemLogService systemLogService;

    @RequestMapping("/")
    public String index(@SessionAttribute(WebSecurityConfig.SESSION_KEY) String account,Model model) {

        model.addAttribute(account);
        return "login";
    }

    @RequestMapping("/login")
    public String login(ModelMap map) {
       
        return "login";
  @PostMapping(value = "login")
    public String login(SysUser sysUser, ModelMap map, HttpServletRequest request, HttpSession session) {
        SysUser sysUser1 = sysUserMapper.login(sysUser);
        if (sysUser1 != null) {
         //如果不為空就代表由此使用者,然後存到日誌裡(這些程式碼和攔截器無關 可忽略)
SystemLog systemLog = new SystemLog(); systemLog.setUserIP(getIpAddr(request)); systemLog.setUserNo(sysUser1.getUserNo()); systemLog.setLogNo(IDUtil.next()); systemLog.setLoginDate(new Date());
           systemLogService.systemLog(systemLog);
             //把SESSION_KEY存到session中
            session.setAttribute("account",WebSecurityConfig.SESSION_KEY); 
           
            map.addAttribute("systemLog", systemLog);
          
            return "/index";
        } else {
            map.put("msg", "賬號或密碼錯誤!");

            return "login";
        }
    }

 

到此就可以實現攔截功能了,登入功能暫沒詳寫。

下面這個是退出登入,移除session,寫在登入的controller類中

 /**
     * 退出登入
     * @param session
     * @return
     */
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        // 移除session
        session.removeAttribute("account");
        return "redirect:/login";
    }