目录
步骤介绍:
1)定义一个拦截器,实现HandlerInterceptor接口
2)创建一个配置类,(相当于在Springmvc配制文件中使用mvc:interceptor接口)
思路:
用户通过从地址栏发起请求,在服务器接受请求之前,我们需要一个Interceptor类,该类中注册规定哪些请求需要进行拦截,哪些不需要拦截.我们可以在这之前先把拦截器写好(也就是如果发生了拦截后重定向到哪里,这个问题),回到Interceptor这个类中,通过方法实现设置哪些请求需要拦截,那些不需要拦截即可.
实现:
1)控制器类
package com.bjpowernode.springboot.web;
import com.bjpowernode.springboot.model.Student;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@org.springframework.stereotype.Controller
@RequestMapping(value="/user")
public class Controller {
@ResponseBody
@RequestMapping(value="/login")
public Object login(HttpServletRequest request) {
Student student=new Student("zhsan",14);
request.getSession().setAttribute("student",student);
return "login successfully";
}
@ResponseBody
@RequestMapping(value="/center")
Object center()
{
return "see the center";
}
@ResponseBody
@RequestMapping(value="/out")
Object out()
{
return "out see anytime";
}
@ResponseBody
@RequestMapping(value="/error")
public Object error()
{
return "error";
}
}
注意我们的验证手段:在login请求中往session中存入一个键值对,然后再在 Interceptor类中取出判断是否有这个键值对的key
2)Interceptor类
该类中规定了判断逻辑( "1)" 中有),如果取到了就返回true,未取到就先重定向,再返回false
package com.bjpowernode.springboot.interceptor;
import com.bjpowernode.springboot.model.Student;
import org.apache.catalina.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import sun.misc.Request;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StudentInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Student student= (Student) request.getSession().getAttribute("student");
if(null==student)
{
response.sendRedirect(request.getContextPath()+"/user/nologin");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3)设置拦截中心类,该类中规定了拦截的范围,哪些需要拦截,哪些不需要拦截.
package com.bjpowernode.springboot.config;
import com.bjpowernode.springboot.interceptor.StudentInterceptor;
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 InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] addPath={
"/user/**"
};
String[] excPath={
"/user/login","/user/error","/user/out"
};
registry.addInterceptor(new StudentInterceptor()).addPathPatterns(addPath).excludePathPatterns(excPath);
}
}
总结:
是什么?
为什么?
怎么办?
1)设置拦截逻辑,被拦截了发向哪里?
2)设置拦截中心,规定自己要拦截哪些请求?