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
});
}
})