十四、Spring Boot与分布式

一、前言
1、简单的登录验证可以通过Session或者Cookie实现。
2、每次登录的时候都要进数据库校验下账户名和密码,只是加了cookie 或session验证后;比如登录页面A,登录成功后进入页面B,若此时cookie过期,在页面B中新的请求url到页面c,系统会让它回到初始的登录页面。(类似单点登录sso(single sign on))。
3、另外,无论基于Session还是Cookie的登录验证,都需要对HandlerInteceptor进行配置,增加对URL的拦截过滤机制。

二、利用Cookie进行登录验证
1、配置拦截器代码如下:

public class CookiendSessionInterceptor implements HandlerInterceptor {     

@Override     
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {         
      log.debug("进入拦截器");         
      Cookie[] cookies = request.getCookies();         
      if(cookies!=null && cookies.length>0){             
            for(Cookie cookie:cookies) {                
                  log.debug("cookie===for遍历"+cookie.getName());                 
                  if (StringUtils.equalsIgnoreCase(cookie.getName(), "isLogin")) {                     
                        log.debug("有cookie ---isLogin,并且cookie还没过期...");                     
                       //遍历cookie如果找到登录状态则返回true继续执行原来请求url到controller中的方法                     
                        return true;                 
                              }             
                        }         
                  }         
            log.debug("没有cookie-----cookie时间可能到期,重定向到登录页面后请重新登录。。。");         
            response.sendRedirect("index.html");         
            //返回false,不执行原来controller的方法         
            return false;     }     

  @Override     
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {   
     }     
  @Override   
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {    
      }  

}

2、在Springboot中拦截的请求不管是配置监听器(定义一个类实现一个接口HttpSessionListener )、过滤器、拦截器,都要配置如下此类实现一个接口中的两个方法。
代码如下:

@Configuration 
public class WebConfig implements WebMvcConfigurer {     
// 这个方法是用来配置静态资源的,比如html,js,css,等等     
@Override     
public void addResourceHandlers(ResourceHandlerRegistry registry) {   
  }    

 // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效    
@Override     
public void addInterceptors(InterceptorRegistry registry) {         
//addPathPatterns("/**") 表示拦截所有的请求         
//excludePathPatterns("/firstLogin","/zhuce");设置白名单,就是拦截器不拦截。首次输入账号密码登录和注册不用拦截!       
//登录页面在拦截器配置中配置的是排除路径,可以看到即使放行了,还是会进入prehandle,但是不会执行任何操作。         
registry.addInterceptor(new CookiendSessionInterceptor()).addPathPatterns("/**").excludePathPatterns("/",                                      
                                                                                                     "/**/login",                                     
                                                                                                     "/**/*.html",                                     
                                                                                                     "/**/*.js",                                     
                                                                                                     "/**/*.css",                                      
                                                                                                     "/**/*.jpg");   
   } 

 }

https://www.cnblogs.com/tenghw/p/13557327.html

spring boot preHandle中返回json

package com.industryiot.authorization.interceptor;

import com.industryiot.authorization.annotation.Authorization;
import com.industryiot.authorization.manager.TokenManager;
import com.industryiot.authorization.model.TokenModel;
import com.industryiot.config.Constants;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.lang.reflect.Method;

/**

  • 自定义拦截器,判断此次请求是否有权限

  • @see com.scienjus.authorization.annotation.Authorization

  • @author ScienJus

  • @date 2015/7/30.
    */
    @Component
    public class AuthorizationInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private TokenManager manager;

    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {
    //如果不是映射到方法直接通过
    if (!(handler instanceof HandlerMethod)) {
    return true;
    }
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Method method = handlerMethod.getMethod();
    //从header中得到token
    String authorization = request.getHeader(Constants.AUTHORIZATION);
    //验证token
    TokenModel model = manager.getToken(authorization);
    if (manager.checkToken(model)) {
    //如果token验证成功,将token对应的用户id存在request中,便于之后注入
    request.setAttribute(Constants.CURRENT_USER_ID, model.getUserId());
    return true;
    }
    //如果验证token失败,并且方法注明了Authorization,返回401错误
    if (method.getAnnotation(Authorization.class) != null) {
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    // String url = “/industryiot/Login.html”;
    // response.sendRedirect(url);

         response.setCharacterEncoding("UTF-8");
         response.setContentType("application/json; charset=utf-8");
         JSONObject res = new JSONObject();
         res.put("status","-1");
         res.put("msg","need login");
         PrintWriter out = null ;
         out = response.getWriter();
         out.write(res.toString());
         out.flush();
         out.close();
         return false;
    

// return true;
}
return true;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值