springboot登入攔截器(簡單實用)
阿新 • • 發佈:2019-02-03
專案使用的是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";
}