JavaWeb项目中写一个SessionUtil(Session中内容的管理器)

最近在写自己的一个SpringBoot练习小项目,(网上商城),里面较多的遇到了从Session中存取对象的情况,于是就想着把Session封装起来,帮助自己使用。

旧方法,也是百度首页的方法。非常的不方便。

// 比如这个作者是在Controller层进行了Request传参
   @RequestMapping(value = "/angus/**", method = RequestMethod.GET) 
   @ResponseBody
   public String getProcess(HttpServletRequest request){
    HttpSession session = request.getSession();
    User user = session.getAttribute("user");
}
--------------------- 
作者:王大淼     原文:https://blog.csdn.net/b222007/article/details/78677700 

又或者是稍微用到了Spring的自动注入的方法。(参考文章:SpringBoot三种获取Request和Response的方法)

(当然我的SessionUtil 并没有用到Spring.)

@Autowired
private HttpServletRequest request;
 
@Autowired
private HttpServletResponse response;

// 这个方法可以成功,但是,但是,你想象一下,每个类中只要有一个方法用到了Session,
// 那么你就要自动注入一个 HttpServletRequest request...
// 实在是不够灵活和方便.
public void doSth(){
    HttpSession = request.getSession();
}

因为我是一个SpringBoot 项目,我就百般百度,终于找到了一个比较好用的封装类SessionUtil :Spring MVC 操作Session的工具类

于是我最后封装出来的结果是:(这样我就能在任意层随意调用session的存储了。)


import cn.edu.zzuli.bean.Shop;
import cn.edu.zzuli.bean.User;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpSession;

/**
 * @ClassName SessionUtil
 * @Description 对于Session中的操作,封装起来,因为键值对中的键是String类型,不便于控制,在这里可以隐藏细节。
 * @Author 过道
 * @Date 2018/12/24 21:00
 * @Version 1.0
 */
public class SessionUtil {
    // 获取一个session对象
    private static HttpSession session = getSession();

    /**
     * user在session中的名字,也就是键值对的键。
     */
    private static final String USER_NAME_IN_SESSION = "user";
    /**
     * shop在session中的名字,也就是键值对的键。
     */
    private static final String SHOP_NAME_IN_SESSION = "shop";

    /**
     * 获取session 的方法
     *
     * @return HttpSession
     */
    public static HttpSession getSession() {
        HttpSession session = null;
        try {
            session = getRequest().getSession();
        } catch (Exception e) {
        }
        return session;
    }

    /**
     * 获取一个request对象的方法
     *
     * @return HttpServletRequest
     */
    public static HttpServletRequest getRequest() {
        ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return (HttpServletRequest) attrs.getRequest();
    }

    /**
     * 从session中获取到当前用户
     *
     * @return
     */
    public static User getUserFromSession() {
        return (User) session.getAttribute(USER_NAME_IN_SESSION);
    }

    /**
     * 更新Session中的user
     *
     * @return 
     */
    public static User updateUserInSession(User user) {
        // 直接放入user,顶替掉原来session中的user
        return putUserIntoSession(user);
    }

    /**
     * 将user放入Session对象中
     *
     * @param user 用户
     * @return
     */
    public static User putUserIntoSession(User user) {
        session.setAttribute(USER_NAME_IN_SESSION, user);
        return getUserFromSession();
    }


    /**
     * 从session中移除User对象
     *
     * @return
     */
    public static User removeUserFromSession() {
        User user = getUserFromSession();
        session.removeAttribute(USER_NAME_IN_SESSION);
        // 移出商店,如果有的话
        if (getShopFromSession() != null) {
            removeShopFromSession();
        }
        return user;
    }

    /**
     * 将shop放入Session对象
     *
     * @param shop 商店
     */
    public static void putShopIntoSession(Shop shop) {
        session.setAttribute(SHOP_NAME_IN_SESSION, shop);
    }

    /**
     * 从session中移除User对象
     *
     * @return
     */
    public static Shop removeShopFromSession() {
        Shop shop = getShopFromSession();
        session.removeAttribute(SHOP_NAME_IN_SESSION);
        return shop;
    }

    /**
     * 从Session中获取到Shop
     *
     * @return 将Session中的Shop返回
     */
    private static Shop getShopFromSession() {
        return (Shop) session.getAttribute(SHOP_NAME_IN_SESSION);
    }

}

比如在登陆Service层里,我的写法就是:


    /**
     * 用户登录操作。将用户存入session,如果他是店家,那么商店也应该被存入Session
     *
     * @param userName 用户名称
     * @param pwd      用户密码
     * @return 相关的用户信息
     */
    @Override
    public User login(String userName, String pwd) {
        //MD5 加密后再与数据库中的密码进行比对
        pwd = MD5Util.md5Pwd(pwd);
        // 通过userName和pwd得到数据库中对应的记录,
        User user = userMapper.login(userName, pwd);
        if (user != null) {
            user.setPwd(null);
            // 得到user对象, 存入Session中
            



            SessionUtil.putUserIntoSession(user);
            


            // 如果用户是一个店家,那么将商店的id放到
            if (user.getRole().equals(UserRoleEnum.SHOPPER)) {
                Shop shop = shopService.getShopByShopperId(user.getUserId());
                SessionUtil.putShopIntoSession(shop);
            }
        }
        return user;
    }

测试一下后成功。

你可能感兴趣的:(小项目和项目经验)