版权声明:转载请点赞,当然附上原文链接也很不错 https://blog.csdn.net/m0_37961948/article/details/85338660
最近在写自己的一个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;
}
测试一下后成功。