上节讲过了登录后将信息存储于session中,但是如何做鉴权页的登录检测呢?这一节讲到spring boot的拦截器
拦截器
您可以在以下情况下使用SpringBoot中的Interceptor来执行操作
- 将请求发送到控制器之前
- 将响应发送到客户端之前 例如,您可以使用拦截器在将请求发送到控制器之前添加请求标头 并在将响应发送到客户端之前添加响应头。
以下是在使用拦截器时应了解的三种方法:
- preHandle()方法-用于在将请求发送到控制器之前执行操作. 此方法应返回true,以将响应返回给客户端.
- postHandle()方法-用于在将响应发送到客户端之前执行操作.
- afterCompletion()方法-用于完成请求和响应后执行操作.
鉴权
- 我们要基于某些路由都需要鉴权登录,例如/admin/*
- 需要判定是ajax还是非ajax请求做出不同处理
实现
- 首先注册拦截器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
//@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/ucenter/*");
}
}
这里对路径以ucenter开头的进行SecurityInterceptor处理
- 具体拦截处理
import com.google.gson.Gson;
import com.vison.learnMall.Response;
import com.vison.learnMall.ResponseRet;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
/**
*
*
*/
public class SecurityInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public SecurityInterceptor() {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// logger.debug(request.getSession().getAttribute(App.SESSION_USER).toString());
if (request.getSession().getAttribute(App.SESSION_USER) != null) {
return true;
}
if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
writer = response.getWriter();
Gson gson = new Gson();
String jsonObject = gson.toJson(new Response(ResponseRet.unLogin, "未登录"));
writer.print(jsonObject);
return false;
}
//未登录的业务逻辑
response.sendRedirect("/login");
return false;
}
}
后记
- 虽然总体上完成了需求,也看上去比较优雅。但是实际业务当中的鉴权路由没有那么统一,特别对于前台项目。本文的做法还是不太方便
- php的继承base控制器,然后走构造方法能不能满足需求,不敢确定。因为不明白具体框架的实现方式,但可以试一试。