phper学习springboot-les4-拦截器

上节讲过了登陆后将信息存储于session中,可是如何作鉴权页的登陆检测呢?这一节讲到spring boot的拦截器php

拦截器

您能够在如下状况下使用SpringBoot中的Interceptor来执行操做html

  • 将请求发送到控制器以前
  • 将响应发送到客户端以前 例如,您可使用拦截器在将请求发送到控制器以前添加请求标头 并在将响应发送到客户端以前添加响应头。

如下是在使用拦截器时应了解的三种方法:java

  • preHandle()方法-用于在将请求发送到控制器以前执行操做. 此方法应返回true,以将响应返回给客户端.
  • postHandle()方法-用于在将响应发送到客户端以前执行操做.
  • afterCompletion()方法-用于完成请求和响应后执行操做.

鉴权

  1. 咱们要基于某些路由都须要鉴权登陆,例如/admin/*
  2. 须要断定是ajax仍是非ajax请求作出不一样处理

实现

  1. 首先注册拦截器
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处理web

  1. 具体拦截处理
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;
    }

}

复制代码

后记

  1. 虽然整体上完成了需求,也看上去比较优雅。可是实际业务当中的鉴权路由没有那么统一,特别对于前台项目。本文的作法仍是不太方便
  2. php的继承base控制器,而后走构造方法能不能知足需求,不敢肯定。由于不明白具体框架的实现方式,但能够试一试。
相关文章
相关标签/搜索