springboot頁面加載時找不到靜態資源下的文件,js與css以及圖片,攔截器

最近在使用springboot時,前幾天正常訪問的頁面,突然間訪問不到js、css、圖片等靜態資源。經過排查發現是由於我發現程序中提示webmvcconfigureradapter已過期,所以改成了WebMvcConfigurationSupport

而WebMvcConfigurationSupport在 springboot的web自動配置類 WebMvcAutoConfiguration 上有條件註解,這個註解的意思是在項目類路徑中缺少 WebMvcConfigurationSupport類型的bean時改自動配置類纔會生效

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
 

所以當我們使用攔截器並繼承WebMvcConfigurationSupport這個類的時候需要重寫addInterceptors這個方法

所以攔截器的配置應該如下

代碼1:

package com.example.syscloud.Interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebSecurityConfig extends WebMvcConfigurationSupport {

@Bean
public SessionInterceptor getSessionInterceptor() {
    return new SessionInterceptor();
}

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    super.addResourceHandlers(registry);
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    /*調用我們創建的SessionInterceptor。
     * addPathPatterns("/**)的意思是這個鏈接下的都要進入到SessionInterceptor裏面去執行
     * excludePathPatterns("/login")的意思是login的url可以不用進入到SessionInterceptor中,直接
     * 放過執行。
     * 注意:如果像註釋那樣寫是不可以的。這樣等於是創建了多個Interceptor。而不是隻有一個Interceptor
     *
     * */
    SessionInterceptor sessionInterceptor=new SessionInterceptor();
    registry.addInterceptor(sessionInterceptor).addPathPatterns("/**")
            .excludePathPatterns("/user/login","/userAPI/login","/user/defaultKaptcha","/publicPage/login","/css/**","/js/**","/img/**","/static/**","/mapper/**");

    super.addInterceptors(registry);
}

}
代碼2:

package com.example.syscloud.Interceptor;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.syscloud.bean.templeBean.UserTokenBean;
import com.example.syscloud.token.TokenUse;
import com.example.syscloud.unit.ReturnCode;
import com.example.syscloud.unit.ReturnData;
import com.example.syscloud.unit.UserTokenMap;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

public class SessionInterceptor implements HandlerInterceptor {

/*在執行Controller的任務之前判斷是否有Session信息
  如果有Session信息就往下執行,去調用Controller。
  如果沒有Session就跳轉到登錄頁面
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    response.setCharacterEncoding("utf-8");
    String token=request.getHeader("token");
    String android=request.getHeader("android");
    if (token!=null){
        boolean bo= TokenUse.tokenVerify(token);
        int userid=TokenUse.getUserID(token);
        UserTokenBean userTokenBean =UserTokenMap.getMap(userid);
        if (userTokenBean!=null) {
            if (userTokenBean.getToken().equals(token) && bo) {
                Map<Integer,UserTokenBean> map=new HashMap<>();
                map=UserTokenMap.getMap();
                map.put(userid,userTokenBean);
                UserTokenMap.setMap(map);
                return true;
            }
        }
    }
    HttpSession session=request.getSession();
    if(session.getAttribute("LoginName")!=null){
        return true;
    }
    if(android!=null){
        ReturnData returnData=new ReturnData();
        returnData.setCode(ReturnCode.Timeout.value());
        returnData.setMessage(ReturnCode.Timeout.getDesc());
        String str=JSON.toJSONString(returnData);
        JSONObject jsonObject=JSON.parseObject(str);
        response.getWriter().print(jsonObject);
    }else {
       //攔截後返回的頁面
        String url = "/publicPage/login";
        // response.sendRedirect(url);
        response.getWriter().print("<script>   top.window.location.href = '"+url+"?r='+Math.random() ;</script>");

    }
    return false;
}

@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 {

}

}
第二段代碼是通過驗證session與token實現攔截與放行功能,我寫一起了,可根據需要刪除部分內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章