自定義註解實現HandlerInterceptorAdapter 攔截請求

 註解類 UnLoginAccessAnnotation.java

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 允許未登錄訪問註解
 */
@Target({ ElementType.METHOD })// 作用範圍:方法(也可以擴大到類上,看需求決定)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UnLoginAccessAnnotation{
	String value() default "";
}

登錄訪問攔截 LoginAccessHandlerInterceptor.java 該類繼承了 org.springframework.web.servlet.handler.HandlerInterceptorAdapter ,重寫了 preHandle 方法。


public class LoginAccessHandlerInterceptor extends HandlerInterceptorAdapter {

    /**
     * 攔截器
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    	HandlerMethod hm = null;
    	Method method = null;
    	if(handler instanceof HandlerMethod) {
    		hm = (HandlerMethod) handler;
            method = hm.getMethod();// 獲取方法
    	} else {
    		return true;
		}
		// 該方法是否添加 允許未登錄訪問註解
        if (method !=null &&  method.isAnnotationPresent(UnLoginAccessAnnotation.class)) { 
			// 不攔截
        	return true;
        }
        String token = CookiesUtils.getToken(request, Const.LoginInfoConstant.JSESSION_ID);
		// 攔截 token 爲空
        if(StringUtils.isEmpty(token)){
            return toLogin(request, response); 
        }
		// 不爲空時解析
        LoginUsersInfo loginUserInfo = JwtUtils.parseUserToken(request,token);
		// jwt 解析失敗
        if(null == loginUserInfo){
            return toLogin(request, response); 
        }
		// 將用戶信息放入request中
        request.setAttribute("loginUserInfo", loginUserInfo);
        return true;
    }

}

 xml配置

<!-- 訪問攔截 -->
  	<mvc:interceptors>
  		<!-- 訪問限制 -->
  		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/static/**"/>
			<mvc:exclude-mapping path="/**/*.css"/>
	        <mvc:exclude-mapping path="/**/*.js"/>
    	    <mvc:exclude-mapping path="/**/*.png"/>
         	<mvc:exclude-mapping path="/**/*.gif"/>
         	<mvc:exclude-mapping path="/**/*.jpg"/>
         	<mvc:exclude-mapping path="/**/*.jpeg"/>
			<bean class="com.david.interceptor.LoginAccessHandlerInterceptor"/>
		</mvc:interceptor>
	</mvc:interceptors>

註解配置

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class InterceptorRegister extends WebMvcConfigurerAdapter{

    private static final Logger logger = LoggerFactory.getLogger(InterceptorRegister.class);

    /*
     * 添加攔截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new LoginAccessHandlerInterceptor());
        super.addInterceptors(registry);
    }

}

接口類

@Controller
@RequestMapping("/topSearch")
public class TopSearchController {

	private static final Log log = LogFactory.getLog(TopSearchController.class);
	
	@Autowired
	private TopSearchService topSearchService;
	
	/**
	 * 查詢熱搜數據,默認前十條
	 * @param query
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value="/get")
	@SkipIntercept // 未登錄允許訪問
	public Result<List<String>> get(TopSearchQuery query) throws Exception {
		return topSearchService.getTopSearchByRange(query.getBegin(), query.getEnd());
	}

}

看看 HandlerInterceptorAdapter 類 

package org.springframework.web.servlet.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * Abstract adapter class for the {@link AsyncHandlerInterceptor} interface,
 * for simplified implementation of pre-only/post-only interceptors.
 *
 * @author Juergen Hoeller
 * @since 05.12.2003
 */
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

	/**
	 * This implementation always returns {@code true}.
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 在方法被調用前執行,如果返回true,則繼續調用下一個攔截器,返回false,則中斷執行。
		return true;
	}

	/**
	 * This implementation is empty.
	 */
	@Override
	public void postHandle(
			HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception {
			// 在方法執行後調用
	}

	/**
	 * This implementation is empty.
	 */
	@Override
	public void afterCompletion(
			HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
			// 在整個請求處理完畢後進行回調,DispatcherServlet完全處理完請求、視圖渲染完畢或者調用方已經拿到響應。
	}

	/**
	 * This implementation is empty.
	 */
	@Override
	public void afterConcurrentHandlingStarted(
			HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
	}

}

 

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