Thymeleaf学习

一、登录页面login.html

前端:

在HTML标签中添加Thymeleaf 支持:xmlns:th="http://www.thymeleaf.org"

为每个变量赋name

后端:

设置多个访问路径到登录页面 如:”/”,”login”

登录页面采用HttpServletRequest.getParameter()获取name字段;

通过比对获取的参数和数据库的参数进行对比判定是否登录成功

使用session存放当前用户的账户信息:session.setAttribute("loginUser",user);

登录成功后使用重定向访问主页 return "redirect:index.html";失败则返回原页面

需要解决刷新重复登录的问题:使用拦截器判断是否登录:Object loginUser =session.getAttribute("loginUser"); 判断对象是否为空来辨别是否重复登录;

在form表单中添加post方法,使用Thymeleaf指定访问路径 th:action="@{/login}

method="post" th:action="@{/login}">

在前端页面的输入框上面添加label标签,使用th:text="${msg} 获取model中的数据 显示当前登录情况

二、页面拦截

防止用户通过地址直接访问页面

可以用三个阶段入手进行拦截:preHandle、postHandle、afterCompletion

步骤:

1、编写一个拦截器类 ---实现HandlerInterceptor接口

package com.laj.admin.interceptor;

import lombok.extern.log4j.Log4j2;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 登录检查
 * 1、配置好拦截器要拦截哪些请求
 * 2、把这些配置放在容器中
 */
@Log4j2
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();
        log.info("拦截的路径是:"+requestURI);

        //登录检查逻辑
        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if (loginUser!=null){
            //放行
            return true;
        }
        //拦截
        request.setAttribute("msg","请先登录!");
        request.getRequestDispatcher("/login").forward(request,response);
        return false;
    }

    /**
     * 目标方法执行完成后
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 页面渲染之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}


2、注册拦截器到容器中 ---实现WebConfigurer的addInterceptor

@Configuration
public class AdminWebconfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")     //添加被拦截的路径  所有请求都被拦截,包括静态资源
                .excludePathPatterns("/","/login","/css/**","/images/**","/js/**","/fonts/**");//排除被拦截的路径
    }
}

3、添加拦截规则 如果是拦截所有,静态资源也会被拦截

拦截器原理:

1、根据当前请求,找到HandlerExecutionChain【可以处理请求的handler以及handler的所有 拦截器】

2、先来顺序执行 所有拦截器的 preHandle方法

  • 1、如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
  • 2、如果当前拦截器返回为false。直接 倒序执行所有已经执行了的拦截器的 afterCompletion;

3、如果任何一个拦截器返回false。直接跳出不执行目标方法

4、所有拦截器都返回True。执行目标方法

5、倒序执行所有拦截器的postHandle方法。

6、前面的步骤有任何异常都会直接倒序触发 afterCompletion

7、页面成功渲染完成以后,也会倒序触发 afterCompletion

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容