Session:
在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
例如,现在我们要的情境是用户如果未登录, 除了访问登录界面,其他的界面被访问的时候被拦截且返回到登录页面。
- 首先, 我们要创建一个存放session登录信息的工具类:
package com.exp.util;
public class ConstantUtils {
public final static String USER_SESSION_KEY="USER";
}
- 然后, 当用户成功登录以后,将用户信息作为一个session对象存放起来。
// 用户存在, 往session里面存储用户
request.getSession().setAttribute(ConstantUtils.USER_SESSION_KEY, user);
- 此时我们尚未添加拦截器, 登录以后可以在任何其他页面拿到session中的用户信息。
- 例如: 我们以jsp页面为例:
用下面的el表达式就能拿到当前session中的用户名
${sessionScope.USER.name }
运行结果:
拦截器:
上面的session实现了之后 , 无论用户登录与否, 项目的页面是都可以访问的, 现在创建拦截器。(未登录不可访问除登录页面以外的其他页面).
- 首先,创建拦截器
package com.exp.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.exp.model.User;
import com.exp.util.ConstantUtils;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
User user = (User) request.getSession().getAttribute(ConstantUtils.USER_SESSION_KEY);
//如果session中没有user,表示没登陆
if (user == null){
//这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
//当然你可以利用response给用户返回一些提示信息,告诉他没登陆
response.sendRedirect(request.getContextPath()+"/");
return false;
}else {
return true; //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
- 然后注入拦截器 ( addPathPatterns 是指为哪些地址添加拦截器, /** 是所有。excludePathPatterns 是指不需要拦截器的地址, 这里除了登录 和退出登录 )
package com.exp.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.exp.interceptor.LoginInterceptor;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
// addPathPatterns("/**") 表示拦截所有的请求,
// excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/","/login","/logout");
}
}
- 这样,当我们未登录的时候,就会重定向到"/" 地址下面。
- 实现了登录拦截。
退出登陆:
即销毁session
@RequestMapping("/logout")
public String logout(HttpServletRequest request){
request.getSession().removeAttribute(ConstantUtils.USER_SESSION_KEY);
return "redirect:/";
}
完整效果: