后台判断请求是否来自微信小程序(SpringBoot拦截器不拦截来自微信小程序的请求)

后台判断请求是否来自微信小程序(SpringBoot拦截器不拦截来自微信小程序的请求)

环境

springboot+微信小程序

背景

开发springboot项目时使用了Interceptor拦截器,用来判断用户是否登陆,如果未登录就访问项目其他页面则跳转登录页.

在开发微信小程序时会请求接口,也会被拦截.

解决

思路一

关闭拦截器………

思路二

小程序储存登陆的cookie.

好像挺麻烦…

思路三

拦截器不拦截来自微信小程序的请求

思路是小程序在request header添加自定义字段,然后拦截器获取请求头自定义字段的值,根据值判断是否放行这个请求

LoginInterceptor.java

package cn.kgc.djz.hangduo.interceptor;

import cn.hutool.core.util.StrUtil;
import cn.kgc.djz.hangduo.controller.UserController;
import cn.kgc.djz.hangduo.model.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/**
 * 拦截器具体操作
 *
 * @author : djz
 * @date : Created in  2020/2/12 23:17
 */
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * controller方法调用前调用
     * 如果未登录则跳转登录页
     *
     * @return 往下执行则返回true,否则返回false
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理
        if ("XMLHttpRequest".equals(request.getHeader("x-requested-with"))) {
            log.info("登陆拦截器1执行,请求地址:" + request.getRequestURI() + "  AJAX请求放行");
            //不拦截ajax请求
            return true;
        }
        if ("true".equals(request.getHeader("isWX"))) {
            log.info("登陆拦截器1执行,请求地址:" + request.getRequestURI() + "  WX请求放行");
            //不拦截微信请求
            return true;
        }
        log.info("登陆拦截器1执行,请求地址:" + request.getRequestURI());

        //获取session中的user
        User user = (User) request.getSession().getAttribute("user");
        //如果为空
        if (user == null) {
            log.info("当前用户未登录,跳转登录页面");
            //重定向到登陆页
            response.sendRedirect(request.getContextPath() + "tologin");
            return false;
        } else {
            log.info("当前用户已登录,登录的用户名为: " + user.getUsername());
        }
        return true;
    }

    /**
     * controller方法调用后视图渲染前执行。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    /**
     * controller方法调用且视图渲染完成后执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

InterceptorConfig.java

package cn.kgc.djz.hangduo.config;

import cn.kgc.djz.hangduo.interceptor.LoginInterceptor;
import cn.kgc.djz.hangduo.interceptor.LoginInterceptor2;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器配置
 * 

* 过滤器依赖于Servlet容器,而Interceptor则为SpringMVC的一部分。 * 过滤器能够拦截所有请求,而Interceptor只能拦截Controller的请求,所以从覆盖范围来看,Filter应用更广一些。 * 但是在Spring逐渐一统Java框架、前后端分离越演越烈,实际上大部分的应用场景,拦截器都可以满足了。 * * @author : djz * @date : Created in 2020/2/12 23:25 */ @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //需要拦截的路径,/**表示需要拦截所有请求 String[] addPathPatterns = {"/**"}; //不需要拦截的路径,当然要包括登录页面 String[] excludePathPatterns = {"/tologin", "/dist/**","/error","/toregister","/uploadicon"}; //注册登录拦截器 //order指定执行顺序,数值越小越优先 //可以配置多个拦截器,给registry再加一个Interceptor就可以了,不用再创建一个新的config配置类。 //拦截器1如果未登录访问首页跳转登录页 registry.addInterceptor(new LoginInterceptor()) .addPathPatterns(addPathPatterns) .excludePathPatterns(excludePathPatterns) .order(0); } }

controller无需改动

微信小程序

//在需要请求后台接口的地方添加自定义请求头
wx.request({
      url: 'http://localhost:8080/queryItem',
      header: {
        'content-type': 'application/json',
        //自定义的字段
        'isWX': 'true'
      },
      method: "get",
      success: function(res) {
        console.log(res.data);
        th.setData({
          dirList: res.data
        });
      }
    })

效果

后台判断请求是否来自微信小程序(SpringBoot拦截器不拦截来自微信小程序的请求)_第1张图片
后台判断请求是否来自微信小程序(SpringBoot拦截器不拦截来自微信小程序的请求)_第2张图片
值全都获取到了

你可能感兴趣的:(SpringBoot)