springboot拦截器
springboot拦截器可以拦截指定请求,功能和servlet的过滤器类似,不过优先级比过滤器低。
springboot拦截器步骤:
- 添加springboot依赖和springMvc依赖
- 创建拦截器类
新建一个类实现HandlerInterceptor 接口并通过@Component注解添加到spring容器中,并重写preHandle方法,在perHandle方法内设置拦截逻辑
package com.kun.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kun.entity.User;
import com.kun.vo.AjaxReturn;
import org.apache.jasper.tagplugins.jstl.core.Out;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User) request.getSession().getAttribute("user");
if(user != null){
//有登陆,放行
return true;
}
//没有登陆判断是Ajax请求还是普通请求
if(!isAjax(request)){
//不是Ajax请求,返回页面
response.sendRedirect(request.getContextPath()+"/");
}else{
//是Ajax请求,返回json
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
//创建返回的对象
AjaxReturn ajaxReturn = new AjaxReturn();
ajaxReturn.setCode(1002);
ajaxReturn.setMsg("请先登陆");
//将对象转为json
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(ajaxReturn);
PrintWriter out = response.getWriter();
out.write(json);
out.flush();
out.close();
}
return false;
}
/**
* 判断是否是Ajax请求
* @param request
* @return true是Ajax请求
*/
public boolean isAjax(HttpServletRequest request){
if(request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
return true;
}else{
return false;
}
}
}
- 注册拦截器
创建一个配置类实现WebMvcConfigurer并添加Configuration注解,并重写addInterceptors方法,在addInterceptors方法中添加拦截器
package com.kun.config;
import com.kun.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
//loginInterceptor拦截器对象,addPathPatterns添加拦截请求,excludePathPatterns设置不拦截的请求
// " /** "拦截根下的所有子孙, “ /* ” 只拦截所有子
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/","/login");
}
}
这样一个登陆拦截器就添加成功了