spring boot(四)登录功能

1、添加login.html界面

**界面路径放在templates目录下

<!DOCTYPE html>
<html lang="en" xmlns: th = "http://www.thymeleaf.org">
  <head>
    <title>login.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    <form action="/user/login" method="post">
    	<input name="username" placeholder="用户名" type="text"/>
    	<input name="password" placeholder="密码" type="password" />
    	<input type="submit" value="登录" />
    </form>
  </body>
</html>

2、编写登录控制器

package com.chenhui.springbootcrud.controller;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.chenhui.springbootcrud.entity.User;
import com.chenhui.springbootcrud.service.UserService;

@Controller
public class LoginController {
	
	@Autowired
	private UserService userService;
	
	@PostMapping("/user/login")
	public String login(@RequestParam("username") String username,@RequestParam("pasword") String passwrod,
			Map<String, Object> map){
		User loginUser = userService.login(username, passwrod);
		if(loginUser!=null){//登陆成功
			return "hello";
		}else{//登录失败
			map.put("msg", "用户名密码错误");
			return "login";
		}
		
	}
}

登录成功就进入hello.html界面

失败跳转到logig.html界面,并附带上失败信息。

3、实现视图映射关系

自第一步中,我们将login.html界面放在了templates目录下,templates目录下的资源是无妨直接访问的。

所以需要添加映射,下面提供两种方式:

  1)、编写控制器

      

@RequestMapping(value = {"/","/index.html"})
	public String toLogin(){
		return "login";
	}

输入127.0.0.1:8888/即可访问到login.html界面

  2)、我们将上面的控制器注释掉,通过下面的代码实现视图映射

package com.chenhui.springbootcrud.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * 扩展mvc配置
 * 
 * @author  chenhui
 * @time    2018年12月7日
 * @e-mail  personalmessage@foxmail.com
 * @company nikey
 */
//@EnableWebMvc //完全接管webMvc配置,如果希望,可以去掉
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport{

	@Override
	protected void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/").setViewName("login");
		registry.addViewController("/index.html").setViewName("login");
	}
	
}

编写自定义的MyMvcConfig类,需要继承org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport类,来扩展webMvc配置。(org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter类已经过时了,源码说的很清楚。

同样能进入登录界面!

4、登录进入hello.html界面

如果密码错误

在login.html表单中添加下面代码

<p th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>

上面代码表示如果msg信息不为空就展示信息!

 

5、防止表单重复提交

   我们进入登录界面,如果刷新界面会发现表单会再次提交,为了防止表单再次提交, 我们需要在登录控制器添加一个重定向。如下:

@PostMapping("/user/login")
	public String login(@RequestParam("username") String username,@RequestParam("password") String passwrod,
			Map<String, Object> map, HttpSession session){
		User loginUser = userService.login(username, passwrod);
		if(loginUser!=null){//登陆成功
			session.setAttribute("loginUser", loginUser);
			return "redirect:/main.html"; //防止表单提交,重定向
		}else{//登录失败
			map.put("msg", "用户名密码错误");
			return "login";
		}

  重定向到main.html界面,然后再视图映射配置中添加映射关系

  

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

这样我们再次登录就会看到

url中进入了main.html界面,我们在刷新机界面,就不会出现表单重复提交的问题。

上面还有一个问题,在换个浏览器我们直接输入上面的地址也会进入这个界面(没用登录的情况下)。所以我们需要添加拦截器

6、添加拦截器

package com.chenhui.springbootcrud.compent;

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

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 登录拦截器
 * 登录检查
 * 
 * @author  
 * @time    2018年12月8日
 * @e-mail  personalmessage@foxmail.com
 * @company nikey
 */
public class LoginHandlerInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		Object user = request.getSession().getAttribute("loginUser");
		if(user == null){//未登录
			request.setAttribute("msg", "没用权限,请先登录");
			request.getRequestDispatcher("index.html").forward(request, response);
			return false;
		}else{//已登录
			return true;
		}
	}

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

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

在preHandle方法中我们判断session中是否有登录信息,来进行判断用户是否是正常登录的,如果没有登录,我们进行拦截,并转发到index.html界面,返回错误信息。

配好拦截器,我们需要将拦截器交个WebMvc容器管理

package com.chenhui.springbootcrud.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import com.chenhui.springbootcrud.compent.LoginHandlerInterceptor;

/**
 * 扩展mvc配置
 * 
 * @author  
 * @time    2018年12月7日
 * @e-mail  personalmessage@foxmail.com
 * @company nikey
 */
//@EnableWebMvc //完全接管webMvc配置,如果希望,可以去掉
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport{

	@Override
	protected void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/").setViewName("login");
		registry.addViewController("/index.html").setViewName("login");
		registry.addViewController("/main.html").setViewName("hello");
	}

	@Override
	protected void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
			.excludePathPatterns("/index.html","/","/user/login");
	}
	
	
}

我们拦截任何请求(除了特定的请求,如上面的 "/index.html","/","/user/login")这样我们再次直接输入http://127.0.0.1:8888/main.html就会跳转到登录界面

 

这样就完成了一个简单的登录功能!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值