目录
登录页面
th:action="@{/user/login}"
<!--提示信息,msg不为空时,显示-->
<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
#strings.isEmpty() thymeleaf的方法:判断字符串是否为空
登录接口
package com.qing.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;
@Controller
public class LoginController {
/**
* 登录
* @param username
* @param password
* @param model
* @param session
* @return
*/
@RequestMapping("/user/login")
public String login(
@RequestParam("username") String username,
@RequestParam("password") String password,
Model model,
HttpSession session) {
// 具体的业务
if (! StringUtils.isEmpty(username) && StringUtils.equals("123456", password)) {
session.setAttribute("loginUser", username);
// 伪链接映射真页面:main.html 映射为 dashboard 映射为 /templates/dashboard.html,地址栏显示为main.html,实际是/templates/dashboard.html
return "redirect:/main.html";
} else {
model.addAttribute("msg", "用户名或密码错误!");
return "index";
}
}
}
伪链接映射真页面
// 如果是main.html,就映射为 dashboard 映射为 /templates/dashboard.html,地址栏显示为main.html,实际是/templates/dashboard.html
registry.addViewController("/main.html").setViewName("dashboard");
package com.qing.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 保留Spring Boot MVC功能,并且扩展其他MVC配置
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* addViewControllers实现无业务逻辑跳转
* 将请求映射为视图,又因为thymeleaf默认提供的视图解析器,映射到template目录下
* / 映射为 index 再映射为 /templates/index.html
* /index.html 映射为 index 映射为 /templates/index.html
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
// 如果是main.html,就映射为 dashboard 映射为 /templates/dashboard.html,地址栏显示为main.html,实际是/templates/dashboard.html
registry.addViewController("/main.html").setViewName("dashboard");
}
/**
* 注册自定义国际化解析器,交给Spring容器管理
* @return
*/
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
}
登录拦截器
package com.qing.config;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登录拦截器
*/
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 验证session中的用户信息
Object loginUser = request.getSession().getAttribute("loginUser");
// 用户没有登录,返回提示信息,转发到登录页,false 拦截
if (loginUser == null) {
request.setAttribute("msg", "没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else {
// true 不拦截
return true;
}
}
}
添加拦截器到配置类
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
// 拦截所有请求,包括静态资源
.addPathPatterns("/**")
// 排除(不拦截)登录页,登录接口,静态资源
.excludePathPatterns("index.html", "/", "/user/login", "/css/**", "/js/**", "/img/**");
}
package com.qing.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 保留Spring Boot MVC功能,并且扩展其他MVC配置
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* addViewControllers实现无业务逻辑跳转
* 将请求映射为视图,又因为thymeleaf默认提供的视图解析器,映射到template目录下
* / 映射为 index 再映射为 /templates/index.html
* /index.html 映射为 index 映射为 /templates/index.html
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
// 如果是main.html,就映射为 dashboard 映射为 /templates/dashboard.html,地址栏显示为main.html,实际是/templates/dashboard.html
registry.addViewController("/main.html").setViewName("dashboard");
}
/**
* 注册自定义国际化解析器,交给Spring容器管理
* @return
*/
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
// 拦截所有请求,包括静态资源
.addPathPatterns("/**")
// 排除(不拦截)登录页,登录接口,静态资源
.excludePathPatterns("index.html", "/", "/user/login", "/css/**", "/js/**", "/img/**");
}
}
注销接口
package com.qing.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
/**
* 登录
* @param username
* @param password
* @param model
* @param session
* @return
*/
@RequestMapping("/user/login")
public String login(
@RequestParam("username") String username,
@RequestParam("password") String password,
Model model,
HttpSession session) {
// 具体的业务
if (! StringUtils.isEmpty(username) && StringUtils.equals("123456", password)) {
session.setAttribute("loginUser", username);
// 伪链接映射真页面:main.html 映射为 dashboard 映射为 /templates/dashboard.html,地址栏显示为main.html,实际是/templates/dashboard.html
return "redirect:/main.html";
} else {
model.addAttribute("msg", "用户名或密码错误!");
return "index";
}
}
/**
* 注销
* @param session
* @return
*/
@RequestMapping("/user/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/index.html";
}
}