前边我们写完了登陆的页面,有一个问题就是,如果我不登录,我直接在浏览器输入登陆后的网址,照样可以进去,那么登录就失去了意义
Google浏览器登录好的页面,直接复制到火狐直接打开
于是我们需要设定一个拦截器,如果你没登录,那么你复制这个链接,就会返回到登录页面
我们在component里边新建一个LoginHandlerInterceptor.java,
然后我们让这个类implements HandlerInterceptor
他有三个方法可以使用,我们按住Ctrl+o 就可以调出来如下所示:
代码如下:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
首先我们在controller里边加入一个session对象,并把username传入到session里边
然后我们在LoginHandlerInterceptor里边写入判断
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("loginUser"); if(user == null) { //未登录,返回登录界面 request.setAttribute("msg", "没有权限,请登录"); request.getRequestDispatcher("/index.html").forward(request, response); } else { //登陆成功 return true; } return false; }
然后我们去配置类里边注册拦截器
我们在Config文件里边按Ctrl+o调出所有的方法,其中addInterceptors就是用来注册拦截器的
里边内容如下
添加拦截路径"/**"表示所有路径,后边的excludePathPatterns则是排除那些不用拦截的页面,登录页面我们就不用拦截了
尤其注意后边的"/user/login"路径也不能拦截,否则别人就没法登录了
你以为这样就完了吗?不!
在springboot1.x中,静态资源比如css js的话,拦截器是不会拦截的,但是2.x中居然会拦截,于是我们还需要给css和js放行,我们在放行的里边添加这两个即可"/asserts/**", "/webjars/**"
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/", "/index", "/index.html", "/user/login", "/asserts/**","/webjars/**"); }
然后我们再次访问main.html就会转到登录页面如下