您的位置:首页 > 编程语言 > Java开发

spring boot 拦截器 登录权限拦截

2019-03-26 15:21 513 查看
版权声明:原创欢迎转载,转载请注明出处 https://blog.csdn.net/ye17186/article/details/88820896

一、需求

系统中,除登录接口/login以外,其他所有接口,必须用户登录后才能访问。

二、实现

创建一个拦截器,拦截除/login以外的所有请求,校验用户是否已登录,如果已登录,则放行,否则拦截请求,给出未登录信息提示。

创建LoginInterceptor类,实现HandlerInterceptor接口,重写preHandle方法

[code]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);
}
}

注册该拦截器

[code]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");
}
}

三、测试

[code]@GetMapping("/say3")
public ApiResp sayHello3() {
log.info("业务处理...");
return ApiResp.retOK();
}

1、发送不带token的请求,请求被拦截,并返回的错误信息提示

2、发送带token的请求,请求正确处理

 

GitHub地址:https://github.com/ye17186/spring-boot-learn

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: