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 {
@Override
public 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 {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//拦截/yang请求到success,但是无法使用success中的数据
registry.addViewController("/yang").setViewName("success");
//为"redirect:/main.html";添加映射
registry.addViewController("/main.html").setViewName("success");
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}
//因为要设置拦截请求所以使用注册的方式
@Override
public 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); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("进入 preHandle 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("进入 postHandle 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI()); } @Override public 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>