权限实现
业务需要
当用户进行敏感操作时,必须要求用户先登录之后才能够拜访后端服务器,例如淘宝、京东.....
应用技术:
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容器治理@Componentpublic 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(); }}