前边我们写完了登陆的页面,有一个问题就是,如果我不登录,我直接在浏览器输入登陆后的网址,照样可以进去,那么登录就失去了意义
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就会转到登录页面如下