註解類 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 {
}
}