登录方法
@Controller
//先设置session中所需的参数
@SessionAttributes("customer")
public class CustomerController{
@Autowired
private UserService service;
@RequestMapping("/login")
@ResponseBody
public Customer login(Customer customer, Model model) {
//先查询
Customer loginCustomer = service.login(customer);
//将当前登录成功后的对象,保存到request和session中
model.addAttribute("customer",loginCustomer);
return loginCustomer;
}
}
登出方法
@RequestMapping("/logout")
public String logout(SessionStatus sessionStatus){
//sessionStatus.isComplete();得到当前session状态。true表示当前session处于活动状态,false表示处于完成状态
// sessionStatus.setComplete();将session设置为完成状态
sessionStatus.setComplete();
return "redirect:/login";
}
方式二
给项目添加javax.servlet.api依赖,通过给方法添加HttpServeltRequest参数后,获取session使用
<!--导入servlet依赖,session-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
登录方法
@RequestMapping("/login")
@ResponseBody
//如果当前项目中有javax.servlet包,就能在任何方法中添加HttpServletRequest参数,从而使用其中的属性
public Customer login(Customer customer, HttpServletRequest req) {
//先查询
Customer loginCustomer = service.login(customer);
req.getSession().setAttribute("customer", loginCustomer);
return loginCustomer;
}
登出方法
@RequestMapping("/logout")
public String logout(HttpServletRequest req) {
//销毁session
req.getSession().invalidate();
return "redirect:/login";
}
无论哪种方式,在页面中都可以使用EL表达式${customer}获取保存在session中的对象
拦截器
每次请求controller时,都要经过的一个类。
当一个SSM项目中有过滤器、拦截器后的执行流程
拦截器与过滤器的区别
- 过滤器Filter依赖于servlet容器,能够对所有请求在发送到DispatcherServlet前进行过滤
- 拦截器Interceptor依赖于springmvc,可以在DispatcherServlet转发请求到某个controller前进行拦截
- 过滤器和拦截器都可以用于权限控制,过滤器更多用于设置编码、屏蔽敏感词等
- 过滤器可以在servlet前后起作用,拦截器可以深入到方法前后起作用
实现过程
1.先导入servlet依赖
<!--导入servlet依赖,使用拦截器-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
2.自定义一个类,实现HandlerInterceptor接口
其中有三个default方法可以重新。
-
preHandle
- 在发送请求后,DispatcherServlet解析控制器中某个RequestMapping前执行的方法
- 该方法返回true时,请求才能继续
-
postHandle
- 在preHandle方法返回值为true后执行
- 在DispatcherServlet解析控制器中某个RequestMapping后执行,解析视图前执行的方法
-
afterCompletion
- 在preHandle方法返回值为true后执行
- 在解析视图后执行的方法
3.在springmvc.xml中配置拦截器
<!--设置拦截器们-->
<mvc:interceptors>
<!--设置其中一个拦截器-->
<mvc:interceptor>
<!--设置要拦截的请求,这里表示拦截一切请求-->
<mvc:mapping path="/**"/>
<!--设置不拦截的请求-->
<!--不拦截静态资源-->
<mvc:exclude-mapping path="/static/**"/>
<!--不拦截登录页面-->
<mvc:exclude-mapping path="/login"/>
<!--不拦截注册页面-->
<mvc:exclude-mapping path="/register"/>
<!--不拦截customer模块-->
<mvc:exclude-mapping path="/customer/**"/>
<!--注入自定义的拦截器类-->
<bean class="com.hqyj.ssm02.interceptor.AuthInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>