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控制器,而後走構造方法能不能知足需求,不敢肯定。由於不明白具體框架的實現方式,但能夠試一試。
相關文章
相關標籤/搜索