拦截器处理Token

扣扣技术分享交流群:1125844267

拦截器处理Token:

package cn.cnic.xiandao.commons.filter;

import cn.cnic.xiandao.util.ApplicationContextProvider;

import cn.cnic.xiandao.util.RedisUtil;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.PrintWriter;

/**

* 拦截器处理token

*/

public class TokenInterceptor implements HandlerInterceptor {

private static RedisUtil redisUtil;

static{

redisUtil = ApplicationContextProvider.getBean(RedisUtil.class);

}

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {

//前端在ajax请求前后都加了过滤器,在登录成功后将生成的token放redis,同时返回给前端,前端在每次请求的请求头中都带Authorization,也就是token值

跨域请求分简单请求和非简单请求,非简单请求每个请求都会请求俩次,第一次是option请求,称为预检请求,预检请求是不需要校验token的

String tokenHeader = httpServletRequest.getHeader("Authorization") == null ? "" : httpServletRequest.getHeader("Authorization");

// 如果不是映射到方法直接通过

if (!(object instanceof HandlerMethod)) {

return true;

}

if(tokenHeader == null || ("").equals(tokenHeader)){ //请求没有带token,重新登录

String json = "{\"code\":-1}";

returnJson(httpServletResponse,json);

return false;

}

if(redisUtil.hasKey(tokenHeader)==false){ //token已过期

String json = "{\"code\":-1}";

returnJson(httpServletResponse,json);

return false;

}

//用户会话时间延长30分钟

redisUtil.expire(tokenHeader, 30 * 60);

return true;

}

/**

* @param response

* @param json

* @throws Exception

* 虽然每个controller类上加了注解@CrossOrigin,但是加了拦截器后还是有跨域的 问题,所以这儿还得解决一下跨域问题

*/

private void returnJson(HttpServletResponse response, String json) throws Exception{

PrintWriter writer = null;

response.setCharacterEncoding("UTF-8");

response.setContentType("application/json; charset=utf-8");

response.setHeader("Access-Control-Allow-Origin", "*");

response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

response.setHeader("Access-Control-Max-Age", "3600");

response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

try {

writer = response.getWriter();

writer.print(json);

} catch (IOException e) {

} finally {

if (writer != null)

writer.close();

}

}

}

从上下文中获取bean

package cn.cnic.xiandao.util;

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.stereotype.Component;

@Component

public class ApplicationContextProvider implements ApplicationContextAware {

private static ApplicationContext applicationContext;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.applicationContext = applicationContext;

}

public static ApplicationContext getApplicationContext() {

return applicationContext;

}

public static Object getBean(String name) {

return applicationContext.getBean(name);

}

public static <T> T getBean(Class<T> tClass) {

return applicationContext.getBean(tClass);

}

}

个人建的交流群1125844267,欢迎大家加入!

如果内容对大家有所帮助,感谢鼓励!实现我小时候一人给我一块钱的美梦,哈哈!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot中,我们可以使用拦截器来验证token拦截器是一种在请求处理之前或之后拦截请求的机制。我们可以在拦截器中编写代码来验证token,并在需要时拒绝请求。为了实现这个目标,我们需要编写一个自定义的拦截器类,并将其配置到Spring Boot应用程序中。 具体步骤如下: 1. 创建一个自定义的拦截器类,例如TokenInterceptor.java。 2. 在拦截器类中编写代码来验证token。可以使用第三方库,例如JWT,来验证token。 3. 创建一个拦截器配置类,例如InterceptorConfig.java。 4. 在拦截器配置类中注册自定义拦截器,并配置拦截器拦截路径和排除路径。 5. 在Spring Boot应用程序中启用拦截器配置。 下面是一个简单的示例代码,演示如何在Spring Boot中使用拦截器验证tokenTokenInterceptor.java: ``` public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 验证token的代码 // 如果token验证失败,可以使用response对象返回错误信息 return true; } } ``` InterceptorConfig.java: ``` @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/login"); // 排除登录请求 } } ``` 在上面的示例代码中,我们创建了一个名为TokenInterceptor的自定义拦截器类,并实现了HandlerInterceptor接口。在preHandle方法中,我们可以编写代码来验证token。如果token验证失败,可以使用response对象返回错误信息。 然后,我们创建了一个名为InterceptorConfig的拦截器配置类,并实现了WebMvcConfigurer接口。在addInterceptors方法中,我们注册了TokenInterceptor拦截器,并配置了拦截路径和排除路径。在这个例子中,我们拦截了所有请求,但排除了/login请求。 最后,在Spring Boot应用程序中启用拦截器配置。这可以通过在应用程序类上添加@EnableWebMvc注解来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Happy-Sir

有收获请打赏,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值