22.SpringBoot实现登录功能(转发和重定向)和功能【前后端结合主要
学思想和使⽤】
这⾥不连接数据库直接通过控制器判断和 SpringMVC 拓展实现:
学习⽬标:
1 . 转发和重定向,这⾥会详细说明;
2. 的定义和注册
3. thymeleaf 的⼀些绑定(略将其实直接去取数据即可)
最后的项⽬结构:
1. 登录功能的实现:
package ller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
import java.util.Map;
@Controller
public class userController {
/**
*⾸页登录控制器
* @return然后视图直接访问
*/
@RequestMapping(value = {"/","/index"})
public String login(){
return "index";
}
/***
* 登录控制器
* @param username  ⽤户名
* @param password  密码
* @param message  登录失败分发的消息
* @param session  Session对象主要⽤来传⽤户名给
* @return
*/
@PostMapping("/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Map<String,Object> message, HttpSession session){
//判断登录条件【这⾥不连接数据库】
if((username!=null && username.equals("Admin")) && (password != null && password.equals("123456")) ){
session.setAttribute("loginUsername",username);    //设置⽤户名表⽰登录成功需要
return "redirect:/main.html";  //防⽌重复提交但是注意这⾥重定向不能是url,这个main.html不存在因为我们的视图在template⽬录下,然⽽我们在拓展哪⾥增加了映射跳转
}
//登录失败那就到登录页⾯
message.put("msg","抱歉,请检查您的账号或密码错误!");
return "index";
}
}
Usercontroller
⾥⾯都有注释,但是为什么重定向是那样的?因为重定向是直接访问url实现,但我们的视图不是在静态⽂件夹下的我们的视图是在 template模板⽂件夹下⾯,不能直接xxxx.html 访问的,
只能通过返回视图实现访问
所以我们需要返回main.html  这个是不存在的但为什么会跳转因为我们配置类中拓展了 SpringMVC的功能:
所以 SpringBoot的重定向功能你懂了没
转发是可以直接转的,但是转发也是不能在 template ⽂件夹下视图⽂件,所以你可以这样:
所以这就是转发和重定向,这就是重定向访问不在静态⽂件夹下⾯的的视图⽂件但是直接⽤那就是另⼀种⽤法了这⾥重点介绍前者。
2.功能
1.定义⾃⼰的:
package com.bihuponent;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
//⾃定义进⾏登录权限实现HandlerInterceptor类
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
为什么使用bootstrap?String username = (String) Session().getAttribute("loginUsername");
if ((username != null) && (!username.isEmpty())){  //判断是否登录
return true;
}
httpServletRequest.setAttribute("msg","抱歉,请先登录");
//没登录直接返回登录页⾯这⾥看起来是转发其实这⾥是重定向(SpringMVC拓展写了转发)
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
LoginHandlerInterceptor
可以看到⾥⾯主要是判断⽤户名如果null  或⽤户名为空的话那就转发然后实现重新登录的功能,⽽且
还携带了信息给模板,模板也可以直接th:text("${msg}") 获取的,可以看到这⾥的 index.html 也是不存在的,也是通过SpringMVC 拓展功能实现转发 + 重定向两个功能。我认为就是这样的写出来的也和⾃⼰想的⼀样。
2.在配置类中注册⾃⼰定义的也是SpringMVC 拓展功能⾥⾯的  addInterceptors ,  详细看代码:
package fig;
import com.bihuponent.LoginHandlerInterceptor;
import com.bihuponent.MyLocaleResolver;
import t.annotation.Bean;
import t.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.fig.annotation.InterceptorRegistry;
import org.springframework.fig.annotation.ViewControllerRegistry;
import org.springframework.fig.annotation.WebMvcConfigurerAdapter;
@Configuration
public class mConfig extends WebMvcConfigurerAdapter {
//添加请求映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index.html").setViewName("/index");    //登录页⾯的充当重定向功能
registry.addViewController("/main.html").setViewName("/dashboard");    //登录成功的充当重定向功能
}
//注册(⾃⼰写的)
@Override
public void addInterceptors(InterceptorRegistry registry) {
//静态资源就不⽤配置了静态资源SpringBoot 已⾃动配置好了
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")        //拦截全部
.excludePathPatterns("/index.html","/","/login"); //排除登录功能请求
}
//添加⾃定义区域代码解析器【国际化】
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
mConfig
总结:为什么要写?正是因为如果配,我们那些⽐如登录成功的页⾯不就直接可以访问了吗那登录毫⽆没意义。
⽐如:
localhost:8080/main.html
main.index 是不存在的,正式因为重定向我们才可以再次跳转到 dashboard这个视图。
静态资源在SpringBoot 中是不⽤配置的。静态资源SpringBoot 已⾃动配置好了
下⾯是模板代码登录页视图注意看下那些thymeleaf表达式吧:
<!DOCTYPE html>
<html lang="en" xmlns:th="">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Signin Template for Bootstrap</title>
<!-- Bootstrap core CSS -->
<link href="asserts/css/bootstrap.min.css" rel="stylesheet" th:href="@{/webjars/bootstrap/4.0.0/dist/css/bootstrap.css}"/>
<!-- Custom styles for this template -->
<link href="asserts/css/signin.css" rel="stylesheet" th:href="@{/asserts/css/signin.css}"/>
</head>
<body class="text-center">
<form class="form-signin"  th:action="@{/login}" method="post">
<img class="mb-4" src="asserts/img/bootstrap-solid.svg" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.title}">Please sign in</h1>
<p th:text="${msg}"></p>
<label class="sr-only">Username</label>
<input type="text" name="username" class="form-control" th:placeholder="#{login.username}" placeholder="Username" required="" autofocus="">
<label class="sr-only" th:text="#{login.passwprd}">Password</label>
<input type="password" name="password" class="form-control" th:placeholder="#{login.passwprd}" placeholder="Password" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> [[#{login.Remember}]]
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.sign}">Sign in</button> <p class="mt-5 mb-3 text-muted">© 2017-2018</p>
<a class="btn btn-sm" th:href="@{/?l=zh_CN}">中⽂</a>
<a class="btn btn-sm" th:href="@{/?l=en_US}">English</a>
</form>
</body>
</html>
index.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。