原因:若是记住首页地址,可以不输入用户名和密码直接输入url进入,不符合业务逻辑,不安全,所以设置拦截器,
拦截器效果:非登录用户,只能访问登录页面,其他页面都不可以访问
1. 登录的控制层中,若登录成功,将用户存入session
package com.cc.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpSession;
import java.util.Map;
@Controller
public class LoginController {
@PostMapping("/login")
public String login(HttpSession session, String username, String password, Map<String,Object>map){
// 判断用户名不为空,且密码为123
if(!StringUtils.isEmpty(username) && "123".equals(password)){
//登录成功
//重定向 redirect: 可以重定向到任何一个请求中(包括其他项目),地址栏改变
// return "main/index"; //在静态资源中查找文件
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}
// 登陆失败
map.put("msg","用户名或密码错误");
return "main/login";
}
}
2.定义拦截器
package com.cc.springboot.Interceptor;
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 {
Object loginUser = request.getSession().getAttribute("loginUser");
if(loginUser!=null){
// 已经登陆过,放行
return true;
}
// 没有登陆过,拦截,返回登录页
request.setAttribute("msg","没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}
}
Ctrl+O使用接口的方法 Ctrl+Alt+v返回值
页面跳转不适用重定向,因为重定向的话,信息带不过去
3.在config中使用拦截器
package com.cc.springboot.config;
import com.cc.springboot.Interceptor.LoginHandlerInterceptor;
import com.cc.springboot.component.MyLocaleResolver;
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;
@Configuration
public class MySpringMvcConfigurer {
@Bean
// 跳转首页
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
// 添加视图控制
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("main/login");
registry.addViewController("/index.html").setViewName("main/login");
registry.addViewController("/main.html").setViewName("main/index");
}
// 拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
// 指定要拦截的请求 /**表示拦截所有请求
.addPathPatterns("/**")
// 排除不需要拦截的路径
.excludePathPatterns("/","/index.html","/login")
// springboot2+之后需要将静态资源文件的访问路径排除,/表示当前文件夹
.excludePathPatterns("/css/*","/img/*","/js/*");
}
};
}
@Bean
// 切换语言 自己定义的区域解析器
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
测试-》输入登陆有的页面,查看是否可以登录