alt+回车:idea的代码提示
测试时应该禁用模板引擎缓存
禁用模板引擎的缓存
spring.thymeleaf.cache=false
页面修改完成以后
ctrl+f9
:重新编译;
thymeleaf语法th:if="${}"做if判断。优先级高于th:text="${}", #strings.isEmpty(msg) #在这里是引用对象这句话的意思是引用strings对象的isEmpty()方法
<button type="submit">登录</button><p style="color: red;" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}">1</p>
一个简单的登录验证
@PostMapping("/checklogin")public String checklogin(@RequestParam String username, @RequestParam String password, Map<String,Object> map, HttpSession session){if (!StringUtils.isEmpty(username) && "123456".equals(password)){map.put("users",new String[]{"lily","lucy"});//为了做登录验证session.setAttribute("username",username);// return "success";//登录页面后防止页面刷新造成的表单重复提交可以使用重定向//要提前增添一个视图映射//重定向的页面获取不到绑定的值//做了重定向之后需要做登录检查,要不然谁都可以不经过登录直接访问return "redirect:/main.html";}map.put("msg","密码错误");return "login";}
写拦截器,拦截器都实现HandlerInterceptor接口
//写完拦截器之后还要注册拦截器
public class LoginHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//检查session中是否存在登录用户Object user=request.getSession().getAttribute("username");if (user==null){//未登录则转发到登录页面request.setAttribute("msg","没有权限先登录");request.getRequestDispatcher("/login").forward(request,response);return false;}else{//已登录,放行return true;}}
为"redirect:/main.html";添加映射,注册LoginHandlerInterceptor拦截器
拦截器也会拦截静态资源,所以也要排除静态资源
public class MyMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {//拦截/yang请求到success,但是无法使用success中的数据registry.addViewController("/yang").setViewName("success");//为"redirect:/main.html";添加映射registry.addViewController("/main.html").setViewName("success");}@Beanpublic LocaleResolver localeResolver(){return new MyLocalResolver();}//因为要设置拦截请求所以使用注册的方式@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/login","/checklogin","/webjars/**","/asserts/**");}
}
springMVC中配置拦截器
先写intercept
public class MyInterceptor implements HandlerInterceptor {private final static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.info("进入 preHandle 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {logger.info("进入 postHandle 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {logger.info("进入 afterCompletion 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI());} }再把intercept注册进interceptors容器中
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/user/index"/><bean class="com.springmvc.intercepter.MyInterceptor"/></mvc:interceptor> </mvc:interceptors>