一、需求
系统中,除登录接口/login以外,其他所有接口,必须用户登录后才能访问。
二、实现
创建一个拦截器,拦截除/login以外的所有请求,校验用户是否已登录,如果已登录,则放行,否则拦截请求,给出未登录信息提示。
创建LoginInterceptor类,实现HandlerInterceptor接口,重写preHandle方法
package com.yclouds.service.demo.interceptor;
import com.yclouds.common.core.error.code.BaseError;
import com.yclouds.common.core.response.ApiResp;
import com.yclouds.common.core.utils.JsonUtils;
import com.yclouds.common.core.utils.StringUtils;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.servlet.HandlerInterceptor;
/**
* 登录拦截器
*
* @author ye17186
* @version 2019/3/26 14:49
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws IOException {
// PreFlight请求,忽略本拦截器
if (CorsUtils.isPreFlightRequest(request)) {
return true;
}
boolean flg = false; // 是否通过
String token = request.getHeader("token");
// 有token表示用户已登录(生产环境应该校验token合法性)
if (StringUtils.isNotEmpty(token)) {
flg = true;
} else {
// 根据系统需要,返回特定的消息格式
ApiResp resp = ApiResp.retFail(BaseError.SYSTEM_NO_LOGIN);
write(request, response, JsonUtils.toJson(resp));
}
return flg;
}
/**
* 通过response返回错误信息给前端
*
* @param request 请求
* @param response 响应
* @param content 响应内容
*/
private void write(HttpServletRequest request, HttpServletResponse response, String content)
throws IOException {
String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", origin);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
response.getWriter().write(content);
}
}
注册该拦截器
package com.yclouds.service.demo.config;
import com.yclouds.service.demo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器配置
*
* @author ye17186
* @version 2019/3/26 15:00
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册登录拦截器,拦截除/login以外的所有请求
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
三、测试
@GetMapping("/say3")
public ApiResp sayHello3() {
log.info("业务处理...");
return ApiResp.retOK();
}
1、发送不带token的请求,请求被拦截,并返回的错误信息提示
2、发送带token的请求,请求正确处理