登录功能实现

  • 登录
  • 登录拦截器


登录

由于我们为了方便,项目没有连接数据库,那么我们就让这个页面输入任意用户名都可以登陆成功

1、首先我们要把登录页面的表单提交地址写一个controller

<form class="form-signin" th:action="@{/user/login}">
    //这里面的所有表单标签都需要加上一个name属性

2、编写对应的controller

@Controller
public class LoginController {

    @RequestMapping("/user/login")
    public String login(
            @RequestParam("username") String username,
            @RequestParam("password") String password,
            Model model,
            HttpSession session){

        //具体的业务,判断用户名密码是否正确
        if (!StringUtils.isEmpty(username)&&"123456".equals(password)){
            session.setAttribute("loginUser",username);
            return "redirect:/main.html";
        }else {
            //告诉用户登陆失败
            model.addAttribute("msg","用户名或密码错误!");
            return "index";
        }
    }
}

然后启动项目测试登陆是否能成功即可

3、登录失败的话,我们需要将后台信息输出到前台,可以在首页标题下面加上判断

<!--如果msg的值为空,则不显示消息-->
<!--判断是否显示,使用if, ${}可以使用工具类,可以看thymeleaf的中文文档-->
<p style="color: red" th:text="${msg}" th:if="${! #strings.isEmpty(msg)}"></p>

优化,登录成功后,由于是转发,链接不变,我们可以重定向到首页!

4、我们再添加一个视图控制映射,在我们的自己的MyMvcConfig中:

registry.addViewController("/main.html").setViewName("dashboard");

5、将 Controller 的代码改为重定向;

//登录成功!防止表单重复提交,我们重定向
return "redirect:/main.html";

重启测试,重定向成功!后台主页正常显示!

登录拦截器

但是又发现新的问题,我们可以直接登录到后台主页,不用登录也可以实现!怎么处理这个问题呢?我们可以使用拦截器机制,实现登录检查

1、我们先自定义一个拦截器

public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //登陆成功之后,应当有用户的session
        Object loginUser = request.getSession().getAttribute("loginUser");
        if (loginUser==null){//没有登陆
            request.setAttribute("msg","没有权限,请先登录!");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }else {
            return true;
        }
    }
}

2、然后将拦截器注册到我们的SpringMVC配置类当中!

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // 注册拦截器,及拦截请求和要剔除哪些请求!
	// 我们还需要过滤静态资源文件,否则样式显示不出来
    registry.addInterceptor(new LoginHandlerInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/index.html","/","/user/login/**","/css/**","/js/**","/img/**");
}

3、我们然后在后台主页,获取用户登录的信息

<!--后台主页显示登录用户的信息-->
[[${session.loginUser}]]

然后我们登录测试拦截器是否有效~

这样我们的登录功能就实现了