关于java:权限实现拦截器以及ThreadLocal介绍

37次阅读

共计 1866 个字符,预计需要花费 5 分钟才能阅读完成。

权限实现

业务需要

当用户进行敏感操作时,必须要求用户先登录之后才能够拜访后端服务器,例如淘宝、京东 …..
应用技术:
1.AOP
2. 拦截器:拦挡用户的申请

定义拦截器

SpringMVC 调用原理图

SpringMVC 拦截器工作原理

配置拦截器

package com.jt.interceptor;
import com.jt.pojo.User;
import com.jt.theardLocal.UserTheardLocal;
import com.jt.util.CookieUtil;
import com.jt.util.ObjectMapperUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import redis.clients.jedis.JedisCluster;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 将拦截器交给 spring 容器治理
@Component
public class UserInterceptor implements HandlerInterceptor {
    //spring4 版本必须实现所有的接口办法,在 spring5 中只须要重写指定的办法即可
 @Autowired
 private JedisCluster jedisCluster;
    /**
 * 需要:拦挡 /cart 结尾的所有的申请进行拦挡,并且校验用户是否登录。。。。* 拦截器抉择:preHanler
 * 如何判断用户是否登录:1. 查看 cookie 的信息,2. 查看 redis 中是否有记录
 * 如果曾经登录过了 true:申请应该放行
 * 如果没有登录 false:申请应该拦挡,配合重定向的语法实现页面跳
 * 转到登录页面,使的程序流转起来
 */
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1. 判断用户是否登录
 // 1.1 查看 cookie 是否有值
 String ticket = CookieUtil.getCookieValue(request, "JT_TICKET");
        //1.2 查看 ticket 是否为 null
 if(!StringUtils.isEmpty(ticket)){
            //2. 校验 redis 中是否有数据
 if(jedisCluster.exists(ticket)){
                //3. 动静获取用户信息
 String userJson=jedisCluster.get(ticket);
                //4. 将 userJson 转换成对象
 User user = ObjectMapperUtil.toObj(userJson, User.class);
                //5. 用 request 将对象当做参数传输给 handler, 然而有个毛病,不是所有的办法中都能够用 request
 //request.setAttribute("JT_USER", user);
 // 在 java 中能够用 ThreadLocal 本地线程变量来实现参数的传输
 UserTheardLocal.set(user);
                return true;// 如果有值则拦截器放行
 }
        }
        // 重定向到登录页面
 response.sendRedirect("/user/login.html");
        return false;// 如果没有登录 false:申请应该拦挡,配合重定向的语法实现页面跳
 }
    @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 销毁数据
 //request.removeAttribute("JT_USER");
 UserTheardLocal.remove();}
}

动静获取 UserId

正文完
 0