SpringMVC归纳-2(Session会话、拦截器)
要点:
1.HttpSession:一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束,借助session能在一定时间内记录用户状态。
2.ModelAndView:既可以设置URL地址,又可以渲染视图。
3.HandlerInterceptor:拦截器接口,通过实现改接口的三个方法(preHandle、postHandle、afterCompletion)可以自定义一个拦截器。
实例:
实现登录、购物车功能。
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>乐淘登录</title>
</head>
<body>
<form action="http://localhost:8888/login-commit" method="post">
<input type="submit" value="login">
</form>
</body>
</html>
mall.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>乐淘商场</title>
</head>
<body>
<form action="http://localhost:8888/shopcar" method="POST">
<label>请选择要购买的书籍:<br>
<input type="checkbox" name="bookname" value="C Prime Plus">C Prime Plus<br>
<input type="checkbox" name="bookname" value="C Prime Plus2">C Prime Plus2<br>
<input type="checkbox" name="bookname" value="C Prime Plus3">C Prime Plus3<br>
<input type="checkbox" name="bookname" value="C Prime Plus4">C Prime Plus4<br>
</label>
<input type="submit" value="加入购物车">
</form>
<form action="http://localhost:8888/quit" method="POST">
<input value="log out" type="submit">
</form>
</body>
</html>
myshoppingcar.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>乐淘购物车</title>
</head>
<body> <h2>我的购物车:</h2>
<!--存在购买时显示已购书籍-->
<ul th:if="${books.size()} != 0">
<li th:each="bookcount:${books}" th:text="${bookcount}"></li>
</ul>
<!--无购买-->
<div th:if="${books.size()} == 0">
您未购买任何书籍!
</div>
<form action="http://localhost:8888/mall" method="GET">
<input type="submit" value="继续购买">
</form> </body>
</html>
Books.java
package com.example.demo.controller.login; import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set; public class Books { private HashMap<String,Integer> books = new HashMap<String,Integer>(); //根据请求URL中获得的表单数组,更新已有书本
public void refreshBooks(String[] newbooks) { for (String book:newbooks) { if (books.containsKey(book)) {
books.put(book, books.get(book)+1);
}else {
books.put(book, 1);
}
}
} //获取books集合,送往页面
public Set<Entry<String, Integer>> getbooks(){
return books.entrySet();
}
}
LoginController.java
package com.example.demo.controller.login; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; @Controller
public class LoginController { //登录界面
@GetMapping("login")
public String getLogin(HttpServletRequest req) {
HttpSession session = req.getSession(); //已登录直接进入到商场
if (session.getAttribute("login")!=null) {
return "redirect:mall";
} return "login";
} //登录请求处理
@PostMapping("login-commit")
public String postLogin(HttpServletRequest req) {
HttpSession session = req.getSession(); //session标记登录状态
session.setAttribute("login",true); return "redirect:mall";
} //退出登录,保留购物记录
@PostMapping("quit")
public String quit(HttpServletRequest req) {
HttpSession session = req.getSession(); session.removeAttribute("login"); return "redirect:login";
} }
ShoppingController.java
package com.example.demo.controller.login; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
public class ShoppingController { //商场
@GetMapping("mall")
public String getMall() {
return "mall";
} //我的购物车
@PostMapping("shopcar")
public ModelAndView getShopCar(ModelAndView view,HttpServletRequest req) { HttpSession session = req.getSession();
Books books = (Books) session.getAttribute("shopcar");//session会话获取已购书籍
String[] newbooks = req.getParameterValues("bookname");//新的购物请求 //从未购买
if (books==null){
books = new Books();
} //刷新session会话
if (newbooks!=null) {
books.refreshBooks(newbooks);
session.setAttribute("shopcar", books);
} //刷新model,渲染视图
view.addObject("books",books.getbooks());
view.setViewName("myshoppingcar"); return view;
}
}
LoginInterceptor.java
package com.example.demo.controller.login; import java.io.IOException; 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 LoginInterceptor implements HandlerInterceptor { @Override
//在Controller方法之前调用
public boolean preHandle(HttpServletRequest req,HttpServletResponse res,Object handler) throws IOException { HttpSession session = req.getSession(); if (session.getAttribute("login") != null) {
System.out.println("login!");
return true;
} res.sendRedirect("login");
return false;
} @Override
public void postHandle(HttpServletRequest req,HttpServletResponse res,Object handler,ModelAndView modelandview) throws Exception {
//Controller方法处理完,但html页面并未送出显示时调用
} @Override
public void afterCompletion(HttpServletRequest req,HttpServletResponse res,Object handler,Exception ex) {
//页面渲染完毕后调用,通常用来回收资源,类似于finally
} }
SpringWebConfig.java
package com.example.demo.controller.login; import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @SpringBootConfiguration
public class SpringWebConfig implements WebMvcConfigurer{ //增加拦截器,可以对特定URL设定拦截以检查是否登录
public void addInterceptors(InterceptorRegistry registry) { //装载一个拦截器,可以使用通配符,或字符串数组
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/mall","/quit");
} }
SpringMVC归纳-2(Session会话、拦截器)的更多相关文章
- SpringMVC配置session过期拦截器,返回登录页面
spring-mvc.xml配置 <mvc:interceptors> <!-- session失效拦截器 --> <mvc:interceptor> <!- ...
- SpringMVC(五)-- springmvc的系统学习之拦截器
资源:尚学堂 邹波 springmvc框架视频 一.拦截器简介 使用拦截器时, (1)实现HandlerInterceptor (2)在springmvc配置文件中配置以下信息 <mvc:int ...
- SpringMVC学习(五)——拦截器示例
部分内容摘自开涛的<跟我学SpringMVC.PDF> 拦截器,本质类似于AOP,主要的应用场景: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV等. 2.权限检查 ...
- springMVC源码分析--HandlerInterceptor拦截器调用过程(二)
在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...
- SpringMVC中session使用&&拦截器&&乱码处理&&异常处理
### 1. 使用Session 通常,会在Session中存放: 1. 客户端(用户)的身份标识,通常是用户的id:2. 使用频率非常高的数据,例如显示在页面中的用户名.头像等:3. 其它的不便于使 ...
- springMVC源码分析之拦截器
一个东西用久了,自然就会从仅使用的层面上升到探究其原理的层面,在javaweb中springmvc更是如此,越是优秀的框架,其底层实现代码更是复杂,而在我看来,一个优秀程序猿就相当于一名武林高手,不断 ...
- springMVC源码分析--HandlerInterceptor拦截器(一)
对SpringMVC有所了解的人肯定接触过HandlerInterceptor拦截器,HandlerInterceptor接口给我们提供了3个方法: (1)preHandle: 在执行controll ...
- SpringMVC源码阅读:拦截器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- SpringMVC -- 梗概--源码--贰--拦截器:Interceptor
附:实体类 1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versi ...
随机推荐
- 入门系列之在Ubuntu 16.04使用Buildbot建立持续集成系统
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由angel_郁发表于云+社区专栏 介绍 Buildbot是一个基于Python的持续集成系统,用于自动化软件构建,测试和发布过程. 在 ...
- 泛微关于js设计的一些小技巧
1.关于泛微流程的js设计 泛微oa可以插入javascript可以diy自己想要的表单页面前端功能.如果有前端开发经验,或者熟练使用jQuery的话,这将变得非常容易!同时泛微OA内部有很多库,包括 ...
- 【Matlab&Mathematica】对三维空间上的点进行椭圆拟合
问题是这样:比如有一个地心惯性系的轨道,然后从轨道上取了几个点,问能不能根据这几个点把轨道还原了? 当然,如果知道轨道这几个点的速度的情况下,根据轨道六根数也是能计算轨道的,不过真近点角是随时间变动的 ...
- SQL Server 数据库部分常用语句小结(三)
21.SQL运行Log的读取 .EXEC xp_readerrorlog 0,1,null,null,'开始时间','结束时间' 22. Alwayson 状况及传输情况监控 SELECT ar.re ...
- oracle创建表空间自增长和创建用户
/* 步骤: 1.创建表空间 2.创建用户 3.用户授权 */ /*创建表空间*/ create tablespace QCJ_TABLESPACE /*表空间物理文件名称*/ datafile 'Q ...
- Python之路【第六篇】:Python迭代器、生成器、面向过程编程
阅读目录 一.迭代器 1.迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 代码如下: while True: ...
- 【转】Python爬取AES加密的m3u8视频流的小电影并转换成mp4
最近发现一个视频网站,准备去爬取得时候,前面很顺利利用fiddler抓包获取网站的post数据loads为python字典数据,分析数据就能发现每个视频的连接地址就在其中, 发现这些都是m3u8文件流 ...
- Redux进阶(一)
State的不可变化带来的麻烦 在用Redux处理深度复杂的数据时会有一些麻烦.由于js的特性,我们知道当对一个对象进行复制时实际上是复制它的引用,除非你对这个对象进行深度复制.Redux要求你每次你 ...
- 《HelloGitHub》第 29 期
公告 月刊现已支持 RSS 订阅 <HelloGitHub>第 29 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. ...
- SQL优化 MySQL版 -分析explain SQL执行计划与Extra
Extra 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:此文章必须有一定的Mysql基础,或观看执行计划入门篇传送门: https:.html 终于总结到哦SQK执行计划的最 ...