登录
开发期间模板引擎页面修改以后,要实时生效
- 禁用模板引擎的缓存 spring.thymeleaf.cache=false
- 页面修改完成以后,ctrl+f9:重新编译
- 登录错误消息显示 th:text="${msg}" th:if="${not #string.isEmpty(msg)}"
- 登录成功,表单防止重复提交,重定向到组件,然后用组件转发
拦截器
注意:拦截器说明,在SpringBoot1.5x时,静态资源在static目录下,访问路径不需要带/static,而且拦截器不会对静态资源拦截;但是SpringBoot2.0x以上时,静态资源会被拦截,并且访问路径需要带上/static,当然拦截器也要放行静态资源;
1、编写拦截器类LoginHandlerInterceptor实现HandlerInterceptor
package com.xue.springbootweb.component;
import org.aopalliance.intercept.Interceptor;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description
* 登录拦截
* @Author xuexue
* @Date 2019/10/14 20:29
*/
public class LoginHandlerInterceptor implements HandlerInterceptor {
//登录之前进行拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获得session
Object status = request.getSession().getAttribute("status");
if (status == null) {
//向页面添加错误信息
request.setAttribute("msg", "没有权限访问");
//转发到登录页面
request.getRequestDispatcher("/login").forward(request, response);
return false;
}
//放行
return true;
}
@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 {
}
}
2、注册拦截器(放行登录页面与登录处理页面)
- MyMvcConfig实现WebMvcConfigurer
- 重写addInterceptors方法注册
代码如下:
package com.xue.springbootweb.config;
import com.xue.springbootweb.component.LoginHandlerInterceptor;
import com.xue.springbootweb.component.MyLocaleResolver;
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;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
/**
* @Description
* 扩展SpringMVC功能
* @Author xuexue
* @Date 2019/10/14 9:16
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* 页面控制
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//跳转至登录页面
registry.addViewController("/login").setViewName("login");
registry.addViewController("/login.html").setViewName("login");
//做重定向到登录处理
registry.addViewController("/main").setViewName("index.html");
}
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//登录页面、登录处理页面不能拦截
registry.addInterceptor(new LoginHandlerInterceptor()).
addPathPatterns("/**").
excludePathPatterns("/login", "/login.html", "/user/login");
}
}
注意:如果SpringBoot在2.0x版本以上则需要放行/static/xx/**(xx根据项目目录而适配,后面图片有讲),并且配上静态资源文件,外部可以直接访问
/**
* 登录拦截器
*
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
String[] excludes = new String[]{"/login", "/login.html", "/user/login", "/static/xx/**"};
registry.addInterceptor(new MyInterceptor()).
addPathPatterns("/**").
excludePathPatterns(excludes);
}
/**
* 添加静态资源文件,外部可以直接访问地址
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//需要配置1:----------- 需要告知系统,这是要被当成静态文件的!
//第一个方法设置访问路径前缀,第二个方法设置资源路径
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
最后,在html文件还要加上/static/xx/xxx.js这样格式的资源,如:
下面目录项目
html需要如下这么做:
<link href="/static/asserts/css/bootstrap.min.css" rel="stylesheet">
这样,2.0以上的SpringBoot静态资源就可以访问了。