Java 過濾器實現(登錄) + 攔截器(兩種方法)


以下是實現未登錄不能進入頁面的實現
使用了thyemeleaf+SpringBoot+過濾器實現的,過濾器的核心代碼如下:
@Component
@WebFilter(filterName = "TestFilter",urlPatterns = "/*")
@Order(1)  //Order(1)在定義多個Filter時,用於決定執行順序的,數字越小,越先執行。
public class TestFilter implements Filter {
    private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(
            Arrays.asList("/index", "/login")));
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        //這樣在每個Servlet執行的時候都會先進行這個
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.println("過濾器實現");
        if(needLogin(request)) {
            // 需要登錄則跳轉到登錄Controller
            String userName = (String)((HttpServletRequest) request).getSession().getAttribute("userName");
            System.out.println("userName="+userName);
            System.out.println(Optional.ofNullable(userName).map(String::length).orElse(0));
            if(Optional.ofNullable(userName).map(String::length).orElse(0) <= 0){
                response.sendRedirect("login");
//              response.sendRedirect(request.getContextPath()+"/login");
            }
            filterChain.doFilter(servletRequest, servletResponse);
           return;
        }else{
        }
        //因為有可能不止這一個過濾器,所以需要將所有的過濾器執行
        //注意 這一行代碼一定要寫到最后
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }

    private boolean needLogin(HttpServletRequest request) {
        //進行是否需要登錄的判斷操作
        String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");
        System.out.println(path);
        boolean allowedPath = ALLOWED_PATHS.contains(path);
        System.out.println(allowedPath);
        return !allowedPath;
    }
 }
View Code

代碼鏈接:

鏈接:https://pan.baidu.com/s/1Kvh4JWCM3aIpiaqK67Rw3g 密碼:pa57

 

過濾器雖然也能實現,但是用起來會有個問題,假如說是我請求http://localhost:8080/usercenter,時,我期望的過程是,在過濾器里發現未登錄,直接就跳轉進入login,但是,實際山遇到的情況是,會先進入我的usercenter方法,跑過這個方法之后再進過濾器,再走login,這就會出現情況,假如說是我的usercenter方法(由於未登錄導致出現方法中出現null的情況)有問題,導致最后頁面報500

,為了解決這個問題,采用了攔截器,正好就是自己想要的效果,未登錄的時候不進入usercenter,直接進入login

一下是攔截器代碼:

攔截器的:

@Configuration
public class LoginInterceptor implements HandlerInterceptor {
    @Override  // 在執行目標方法之前執行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("------:進來攔截器了!--1");
        //獲取session
        HttpSession session = request.getSession(true);
        //判斷用戶ID是否存在,不存在就跳轉到登錄界面
        if(session.getAttribute("phoneNum") == null){
            System.out.println("------:跳轉到login頁面!");
            response.sendRedirect(request.getContextPath()+"/login");
            return false;
        }else{
            session.setAttribute("phoneNum", session.getAttribute("phoneNum"));
            return true;
        }
    }

    @Override  // 執行目標方法之后執行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("------:進來攔截器了!--2");
    }

    @Override  // 在請求已經返回之后執行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("------:進來攔截器了!--3");
    }
}
View Code

配置文件的:WebConfig.java的代碼:

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public WebConfig(){
        super();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
        registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/");
        super.addResourceHandlers(registry);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //攔截規則:除了login,其他都攔截判斷
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/index", "/login","register");
        super.addInterceptors(registry);
    }

}
View Code

這樣就能完美的解決過濾器時遇到的問題

結束

代碼鏈接:鏈接:https://pan.baidu.com/s/1QusjeJ2EVo4K55xN_saooQ 密碼:nh85


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM