zoukankan      html  css  js  c++  java
  • spring boot 拦截器 示例

    一、MVC配置类  WebMvcConfig 

     1、spring启动加载

    package com.seven.mobile.uom.main.config;

    import com.alibaba.fastjson.serializer.SerializerFeature;
    import com.alibaba.fastjson.support.config.FastJsonConfig;
    import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    import com.github.pagehelper.PageHelper;
    import com.seven.mobile.uom.api.interceptor.AuthenticationInterceptor;
    import com.seven.mobile.uom.main.fastjson.CustomSerializeConfig;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.ldap.core.LdapTemplate;
    import org.springframework.ldap.core.support.LdapContextSource;
    import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;


    /**
    * class_name: WebMvcConfig
    * package: com.seven.mobile.uom.main.config
    * describe: MVC配置类
    * @author: yezh5
    * @date: 2017/11/25
    * @time: 20:15
    **/
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    private final static Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);


    /**
    * LDAP 工具
    * @param url
    * @param username
    * @param password
    * @return
    */
    @Bean
    public LdapTemplate ldapTemplate(@Value("${ldap.provider.url}") String url, @Value("${ldap.security.userDn}") String username,
    @Value("${ldap.security.password}") String password) {
    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl(url);
    contextSource.setUserDn(username);
    contextSource.setPassword(password);
    // contextSource.setBase(base);
    // 是否启用线程池
    contextSource.setPooled(true);
    // 应用配置
    contextSource.afterPropertiesSet();
    return new LdapTemplate(contextSource);
    }
    /**
    * 方法级验证
    * @return
    */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
    }


    //配置mybatis的分页插件pageHelper
    @Bean
    public PageHelper pageHelper(){
    System.out.println("MyBatisConfiguration.pageHelper()");

    PageHelper pageHelper = new PageHelper();
    Properties properties = new Properties();
    properties.setProperty("offsetAsPageNum","true");
    properties.setProperty("rowBoundsWithCount","true");
    properties.setProperty("reasonable","true");
    /**
    * 配置mysql数据库的方言
    */
    properties.setProperty("dialect","mysql");
    pageHelper.setProperties(properties);
    return pageHelper;
    }


    /**
    * 添加拦截器配置
    * @return
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/api/**");
    }

    @Bean
    public AuthenticationInterceptor authenticationInterceptor() {
    return new AuthenticationInterceptor();
    }

    /**
    * fastjson相关配置
    *
    * @return
    */
    private FastJsonConfig getFastJsonConfig() {
    logger.info("getFastJsonConfig.....");
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    //serializerFeatureList中添加转换规则
    List<SerializerFeature> serializerFeatureList = new ArrayList<SerializerFeature>();
    //输出key时是否使用双引号
    serializerFeatureList.add(SerializerFeature.QuoteFieldNames);
    //是否输出值为null的字段
    serializerFeatureList.add(SerializerFeature.WriteMapNullValue);
    //数值字段如果为null,输出为0,而非null
    serializerFeatureList.add(SerializerFeature.WriteNullNumberAsZero);
    //List字段如果为null,输出为[],而非null
    serializerFeatureList.add(SerializerFeature.WriteNullListAsEmpty);
    //字符类型字段如果为null,输出为"",而非null
    serializerFeatureList.add(SerializerFeature.WriteNullStringAsEmpty);
    //Boolean字段如果为null,输出为false,而非null
    serializerFeatureList.add(SerializerFeature.WriteNullBooleanAsFalse);
    //null String不输出
    serializerFeatureList.add(SerializerFeature.WriteNullStringAsEmpty);
    //Date的日期转换器
    serializerFeatureList.add(SerializerFeature.WriteDateUseDateFormat);

    SerializerFeature[] serializerFeatures =
    serializerFeatureList.toArray(new SerializerFeature[serializerFeatureList.size()]);

    fastJsonConfig.setSerializerFeatures(serializerFeatures);
    fastJsonConfig.setSerializeConfig(new CustomSerializeConfig());
    return fastJsonConfig;

    }

    /**
    * fastJson相关设置
    */
    private FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
    logger.info("fastJsonHttpMessageConverter........");

    FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();

    List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
    supportedMediaTypes.add(MediaType.parseMediaType("text/plain;charset=utf-8"));
    supportedMediaTypes.add(MediaType.parseMediaType("text/html;charset=utf-8"));
    supportedMediaTypes.add(MediaType.parseMediaType("text/json;charset=utf-8"));
    supportedMediaTypes.add(MediaType.parseMediaType("application/json;charset=utf-8"));
    supportedMediaTypes.add(MediaType.parseMediaType("text/html;charset=utf-8"));
    supportedMediaTypes.add(MediaType.parseMediaType("*"));

    fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
    fastJsonHttpMessageConverter.setFastJsonConfig(getFastJsonConfig());

    return fastJsonHttpMessageConverter;
    }

    /**
    * 添加fastJsonHttpMessageConverter到converters
    */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    logger.info("configureMessageConverters........");

    converters.add(fastJsonHttpMessageConverter());
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
    .addResourceLocations("classpath:/META-INF/resources/");

    registry.addResourceHandler("/webjars/**")
    .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }


    }

    二、AuthenticationInterceptor    CLASS

    1、登录过滤

    2、验证接口请求中的token

    /*
    * Copyright (c) 2017 seven.com. All Rights Reserved.
    */
    package com.seven.mobile.uom.api.interceptor;

    import com.alibaba.fastjson.JSONObject;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    import com.seven.mobile.uom.common.model.SysUserDO;
    import com.seven.mobile.uom.common.response.BaseResponse;
    import com.seven.mobile.uom.common.response.ResponseCode;
    import com.seven.mobile.uom.common.response.StatusCode;
    import com.seven.mobile.uom.common.service.RedisService;
    import com.seven.mobile.uom.common.util.RequestHolder;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import java.io.PrintWriter;

    import static com.seven.mobile.uom.common.constant.LoginConstant.*;

    /**
    * <p>
    * token校验拦截器
    * </p>
    * @author
    * @date 2017-12-07
    */
    public class AuthenticationInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisService redisService;

    private static final String LOGIN_URL="login/login";

    @Override
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {

    // 如果不是映射到方法直接通过
    if (!(handler instanceof HandlerMethod)) {
    return true;
    }

    // 如果是映射到登陆方法直接通过
    String url = request.getRequestURI();
    if(url.contains(LOGIN_URL)){
    return true;
    }
    // 从 http 请求头中取出 token,取不到返回false
    String token = request.getHeader(ACCESS_TOKEN);
    if (token == null) {
    resultInfo(response,ResponseCode.NO_TOKEN);
    return false;
    }
    // 根据token去缓存中验证
    Object sysUserDO=redisService.get(LOGIN_TOKENS,token);
    if(null!=sysUserDO){
    SysUserDO sysUser=(SysUserDO)sysUserDO;
    RequestHolder.add(sysUser);
    RequestHolder.add(request);

    return true;
    }else{
    resultInfo(response,ResponseCode.TOKEN_ERROR);
    return false;

    }

    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    removeThreadLocalInfo();
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    removeThreadLocalInfo();
    }
    public void removeThreadLocalInfo() {
    RequestHolder.remove();
    }

    /**
    * token为null 返回处理
    * @param response
    * @param code
    * @throws Exception
    */
       private void resultInfo(HttpServletResponse response, StatusCode code) throws Exception {
    BaseResponse resp = new BaseResponse();
    resp.setCode(code);
    response.setContentType("application/json;charset=UTF-8") ;
    PrintWriter writer = response.getWriter();
    writer.write(JSONObject.toJSONString(resp, SerializerFeature.WriteEnumUsingToString));
    writer.flush();
    writer.close();
    }
    }


  • 相关阅读:
    sqlilab less19-less22
    sqlilab less11-less18
    逆向——序列号相关总结
    xctf攻防世界——crackme writeup
    ESP定律脱壳——NsPack3.x脱壳
    避免全局变量漫天飞
    C语言实现队列
    STM32中的C语言知识点
    超时事件时间戳
    STM32-电源控制、低功耗模式
  • 原文地址:https://www.cnblogs.com/fuqiang-terry/p/8045816.html
Copyright © 2011-2022 走看看