一般来说,我们在进行一些操作的时候,顺序为:我们需要先登录,登录后才可以进行一些操作;当我们隔一段时间未操作后,存储在session的信息过期后,则需要重新进行登录才可以进行后续的操作;
所以当我们每次进行操作的时候,都要进行判断用户是否是有登录;如果在每块接口前面都写这块的判断就比较复杂繁琐,并且后续进行修改的时候,也会比较复杂;所以一般来说,我们会通过拦截器的方式,对我们需要加上判断的接口进行拦截;
登录拦截器配置:
1、首先,我们需要写一个拦截器。这个拦截器的类需要实现HandlerInterceptor;并且重写他的三个方法;登录拦截器的话,主要是在他的pre进行判断,也就是进入接口时,先进行判断session中有没有登入的信息,如果没有的话,就直接抛异常或者是跳转至登录界面;如果判断session有信息,则往下走
package com.cmj.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoadLanjieqi implements HandlerInterceptor {
@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);
}
@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 boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("你到拦截器了");
HttpSession session = request.getSession();
Object student = session.getAttribute("student");
if (student==null) {
System.out.println("未登录"+session.getId());
throw new Exception("还没登录,请及时登录");
}
System.out.println(session.getId());
return true;
}
}
拦截器写好之后,我们就要进行配置;这边我们要注意的是,我们不能把登录的接口也被我们上面的拦截器所拦截;如果被拦截的话,我们会发现,程序会进入一个死循环,也就是,我都还没登入的时候,这个时候我想去登入,但是这个时候登录的接口被拦截器拦住,他一直判断我之前没有登录,又叫我去登录;所以进入了一个死循环的状态;所以这个时候,我们在进行配置的时候,需要将登录的接口给排除掉
在我之前的配置SpringMvc扫描组件的配置文件下进行配置:MyServlet.xml中进行配置
<mvc:interceptors>
<!-- 配置2个拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/student/**"/>
<!--在使用通配符的过程中 排除指定拦截 -->
<mvc:exclude-mapping path="/student/loading"/>
<bean class="com.cmj.interceptor.LoadLanjieqi"/>
</mvc:interceptor>
通过exclude-mapping path="/xx/xx"/排除掉不需要被拦截的端口;
3、在各个请求进行对应的session获得
下方我们就以登录的loading入口,我们如何在登录后,把对应的数据写入到session;
通过 req.getSession().setAttribute("student", "xiaoming")这边后面可以传入一个student的对象;这样就可以把相关内容写入到session中;后续如果有出现修改相关内容时,我们也需要同步至session中
@PostMapping("/loading")//登陆接口
public String postStudent(@RequestBody String name ,HttpServletRequest req,HttpServletResponse res) {
//往session中放对应的数据
req.getSession().setAttribute("student", "xiaoming");
System.out.println(req.getSession().getId());
System.out.println(name);
return null;
}
//新增学生
@PostMapping("/postStudent11")//插入学生
public String postStudent11(@RequestBody Student student,HttpServletRequest req,HttpServletResponse res) {
System.out.println(student);
System.out.println(req.getSession().getId());
return "success";
}