/**
* Copyright 2018-2020 stylefeng & fengshuonan (https://gitee.com/stylefeng)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hanhan.interceptor;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.hanhan.Cnst.JwtConstants;
import com.hanhan.utils.JwtTokenUtil;
import com.hanhan.utils.RenderUtil;
import hanhan.Msg;
import hanhan.p;
import io.jsonwebtoken.JwtException;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* Rest Api接口鉴权
*HandlerInterceptorAdapter
* @author stylefeng
* @Date 2018/7/20 23:11
*/
public class RestApiInteceptor implements HandlerInterceptor {
private org.slf4j.Logger log= org.slf4j.LoggerFactory.getLogger(this.getClass());
//handler,是指controller的@Controller注解下的整个方法名
//ResourceHttpRequestHandler是静态资源
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//跨域,一定要放在最前面
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST,OPTIONS,GET");
//20天有效
response.setHeader("Access-Control-Max-Age", "1728000");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setCharacterEncoding("UTF-8");
// System.out.println("¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥《"+JSON.toJSONString(handler)+"》¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥44");
p.p("request.getHeader(JwtConstants.AUTH_HEADER) "+request.getHeader(JwtConstants.AUTH_HEADER));
// response.setCharacterEncoding("UTF-8");
// response.setHeader("Content-type", "text/html;charset=UTF-8");
// response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Allow-Headers", "X-Requested-With,content-type,token");
// response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
// 这个可以用过滤器统一处理
// CORS "pre-flight" request
if (handler instanceof org.springframework.web.servlet.resource.ResourceHttpRequestHandler) {
return true;
}
// try {
// handlerMethod = (HandlerMethod) handler;
// } catch (Exception e) {
// e.printStackTrace();
// }
return check(request, response, handler);
}
private boolean check(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("======通过jwt拦截器=开始=====");
// if (request.getServletPath().contains(JwtConstants.AUTH_PATH)) {
// return true;
// }
final String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
System.out.println("================2=="+requestHeader+"======="+JSON.toJSONString(request.getHeaderNames())+"========");
Msg msg=new Msg().setStatus("0");
String authToken;
if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
authToken = requestHeader.substring(7);
//验证token是否过期,包含了验证jwt是否正确
try {
boolean flag = JwtTokenUtil.isTokenExpired(authToken);
if (flag) {
msg.setMsg("jwt错误或者token过期");
RenderUtil.renderJson(response,msg);
return false;
}
} catch (JwtException e) {
msg.setMsg("jwt token解析失败");
//有异常就是token解析失败
RenderUtil.renderJson(response,msg);
return false;
}
} else {
msg.setMsg("header开头没有带上Bearer以及一个空格");
//header没有带Bearer字段
RenderUtil.renderJson(response,msg);
return false;
}
System.out.println("sdlkfjaslkfdj111111111111111111111lasfjdadslfkj");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
// System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse res, Object o, Exception e) throws Exception {
// System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
package com.hanhan.config;
//import com.alibaba.druid.pool.DruidDataSource;
//import com.alibaba.druid.support.http.StatViewServlet;
//import com.alibaba.druid.support.http.WebStatFilter;
//import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator;
//import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
//import org.springframework.aop.Advisor;
//import org.springframework.aop.support.DefaultPointcutAdvisor;
//import org.springframework.aop.support.JdkRegexpMethodPointcut;
import com.hanhan.interceptor.RestApiInteceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
//import org.springframework.boot.web.servlet.FilterRegistrationBean;
//import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
//import org.springframework.boot.web.servlet.ServletRegistrationBean;
//import org.springframework.context.annotation.Bean;
//import org.springframework.web.context.request.RequestContextListener;
//import java.util.Arrays;
//import java.util.Properties;
/**
* web 配置类
*
* @author fengshuonan
* @date 2016年11月12日 下午5:03:32
*
*
*
* WebMvcConfigurer
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/* @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedHeaders("*")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS")
.allowCredentials(true).maxAge(3600*3600);
}*/
/**
* 增加对rest api鉴权的spring mvc拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RestApiInteceptor())
.addPathPatterns("/jwt/**")
.addPathPatterns("/jwt")
.addPathPatterns("/jwt/*")
// .addPathPatterns("/apilogin")
;
}
/*
@Autowired
private GunsProperties gunsProperties;
*/
/**
* 增加swagger的支持
*/
/* @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (gunsProperties.getSwaggerOpen()) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}*/
/**
* 默认错误页面,返回json
*/
/* @Bean("error")
public GunsErrorView error() {
return new GunsErrorView();
}
*/
/**
* druidServlet注册
*/
/* @Bean
public ServletRegistrationBean druidServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet());
registration.addUrlMappings("/druid/*");
return registration;
}*/
/**
* druid监控 配置URI拦截策略
*/
/* @Bean
public FilterRegistrationBean druidStatFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加过滤规则.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter(
"exclusions", "/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*");
//用于session监控页面的用户名显示 需要登录后主动将username注入到session里
filterRegistrationBean.addInitParameter("principalSessionName", "username");
return filterRegistrationBean;
}*/
/**
* druid数据库连接池监控
*/
/* @Bean
public DruidStatInterceptor druidStatInterceptor() {
return new DruidStatInterceptor();
}
@Bean
public JdkRegexpMethodPointcut druidStatPointcut() {
JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();
String patterns = "cn.stylefeng.guns.modular.*.service.*";
//可以set多个
druidStatPointcut.setPatterns(patterns);
return druidStatPointcut;
}*/
/**
* druid数据库连接池监控
*/
/* @Bean
public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() {
BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator();
beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class);
beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor");
return beanTypeAutoProxyCreator;
}
*/
/**
* druid 为druidStatPointcut添加拦截
*
* @return
*/
/* @Bean
public Advisor druidStatAdvisor() {
return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());
}*/
/**
* xssFilter注册
*/
/*@Bean
public FilterRegistrationBean xssFilterRegistration() {
XssFilter xssFilter = new XssFilter();
xssFilter.setUrlExclusion(Arrays.asList("/notice/update", "/notice/add"));
FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter);
registration.addUrlPatterns("/*");
return registration;
}*/
/**
* RequestContextListener注册
*/
/*@Bean
public ServletListenerRegistrationBean requestContextListenerRegistration() {
return new ServletListenerRegistrationBean<>(new RequestContextListener());
}*/
/**
* ConfigListener注册
*/
/* @Bean
public ServletListenerRegistrationBean configListenerRegistration() {
return new ServletListenerRegistrationBean<>(new ConfigListener());
}
*/
/**
* 验证码生成相关
*/
/* @Bean
public DefaultKaptcha kaptcha() {
Properties properties = new Properties();
properties.put("kaptcha.border", "no");
properties.put("kaptcha.border.color", "105,179,90");
properties.put("kaptcha.textproducer.font.color", "blue");
properties.put("kaptcha.image.width", "125");
properties.put("kaptcha.image.height", "45");
properties.put("kaptcha.textproducer.font.size", "45");
properties.put("kaptcha.session.key", "code");
properties.put("kaptcha.textproducer.char.length", "4");
properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}*/
}
package com.hanhan.utils;
import com.alibaba.fastjson.JSON;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class RenderUtil {
public RenderUtil() {
}
public static void renderJson(HttpServletResponse response, Object jsonObject) {
try {
// response.addHeader("Access-Control-Allow-Origin", "*");
// response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
// response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
// response.addHeader("Access-Control-Max-Age", "1800");//30 min
// response.setContentType("application/json");
// response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(jsonObject));
} catch (IOException var3) {
throw new RuntimeException("拦截器返回信息异常");
}
}
}
Title