有时候我们登录网页如淘宝、京东,我们如果没登陆点击购买商品的话,界面将会跳转到登录页/注册页让我们先进行登录/注册,这里面就用到了拦截器,阻止我们没登陆时进行操作。
一、 控制器处理请求
- 先创建一个login.html和success.html,login.html用来登录,success.html表示成功后跳转的页面,也是需要拦截的界面。
<!--login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/check" method="post">
id:<input type="text" name="id">
name:<input type="text" name="name">
<input type="submit" value="提交">
</form>
</body>
</html>
**********************************************************
<!--success.html,使用thymeleaf获取值-->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
登陆成功!欢迎你:<span th:text="${session.person.getName()}"/>
</body>
</html>
2.创建控制器用来处理请求
package com.yhr.boot04.controller;
import com.yhr.boot04.bean.Person;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import javax.servlet.http.HttpSession;
@Controller
public class IndexController {
//登录页
@GetMapping(value = {"/","/login"})
public String login(){
return "login";
}
//校验数据
@PostMapping(value = "/check")
public String successPage(Person person,HttpSession session){
if (StringUtils.hasLength(person.getName()) && StringUtils.hasLength(person.getId())){
session.setAttribute("person",person);//确保id和name不为空,放入session域中。
return "redirect:/success.html";
}else {
return "login";//为空继续保留在登录页
}
}
//成功页
@GetMapping(value = "/success.html")
public String success(){
return "success";
}
}
二、 创建拦截器拦截请求
package com.yhr.boot04.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor{
//拦截之前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object person = session.getAttribute("person");//获取登录页拿到的值
if (person != null){
return true;//有值就能跳入success.html
}
response.sendRedirect("login");//session中的person如果为空就重新重定向跳回登录页
// request.getRequestDispatcher("login").forward(request,response);
System.out.println("登陆失败");
return false;
}
//拦截之后
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
//postHandle之后
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
三、 配置拦截器
在我的项目中需要拦截success.html,其余的放行即可
package com.yhr.boot04.config;
import com.yhr.boot04.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {//注册拦截器
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")//全部拦截
.excludePathPatterns("/","/check","/login");//放行这些请求
}
}
四、 测试
- 登录页:
- 如果想直接去成功页就会被拦截,并在控制台打印错误信息。
- 输入正确信息
显示页面:
成功!