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 ...
随机推荐
- CSharpGL(49)试水OpenGL软实现
CSharpGL(49)试水OpenGL软实现 CSharpGL迎来了第49篇.本篇内容是用C#编写一个OpenGL的软实现.暂且将其命名为SoftGL. 目前已经实现了由Vertex Shader和 ...
- BFPRT算法
解决的问题:在一个数组中找到最小的k个数 常规解法:1.排序,输出前k个数,时间复杂度O(n*log(n)). 2.利用一个大小为k的大根堆,遍历数组维持大根堆,最后返回大根堆就可以了,时间复杂度O( ...
- cnzz流量统计
var regexp=/\.(baidu)(\.[a-z0-9\-]+){1,2}\//ig; var where =document.referrer; if(where.indexOf(" ...
- 如何使用Android Studio在安卓平台对Unity开发的应用进行性能检查?
0x00 前言 大家常常会抱怨安卓平台没有一个统一.好用的性能检查工具.不能像iOS的instrument那样方便. 图片来自:Instruments Help 比如,Unity Blog在3年前就已 ...
- 又双叒叕换,微软这次换Edge了
http://tech.sina.com.cn/it/2018-12-06/doc-ihmutuec6481129.shtml 其实两个月前跟一个微软的前同事聊天已经听说过微软要基于Chromiun来 ...
- mpvue小程序开发之 城市定位
背景: 在进行小程序开发时,有一个定位城市的需求,下面就来讲讲怎么实现这个功能的吧 解决方案: 小程序的wx.getLocation()获得是经纬度并不包含地名,所以要通过经纬度用相应的地图转换出地名 ...
- #Java学习之路——基础阶段二(第七篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- Eclipse中使用Maven搭建SSM框架
Eclipse中不使用Maven搭建SSM框架:https://www.cnblogs.com/xuyiqing/p/9569459.html IDEA中使用Maven搭建SSM框架:https:// ...
- 解决 React-Native mac 运行报错 error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by ope
React-Native 开发的项目,Android 方面没有任何问题,IOS 就是无法跑起来,报错信息如下: mac 10.14.4 xcode 10.2.1 error Failed to bui ...
- 【机器学习】--EM算法从初识到应用
一.前述 Em算法是解决数学公式的一个算法,是一种无监督的学习. EM算法是一种解决存在隐含变量优化问题的有效方法.EM算法是期望极大(Expectation Maximization)算法的简称,E ...