SpringMVC
SSM:mybatis + Spring + SpringMVC MVC三层架构 MVC三层架构
JavaSE: 认真学习,老师带,入门快
JavaWeb:认真学习,老师带,入门快
SSM框架: 研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力
SpirngMVC + VUE + SPRINGBOOT + Springcloud + linux
SSM-=JAVAweb做项目
spring aop 和 ioc
SpringMVC : SpringMVC的执行流程!!
springMVC:SSM框架整合
spring
mvc:模型(dao,service) 视图层(jsp) 控制器(servlet)
dao
service
servlet:转发,重定向
jsp/html
前端 数据传输 实体类
实体类 :用户名 密码 生日 爱好 … . …20个
前端:用户名 密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8t77upF6-1642507318661)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220108234335080.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXNBpH5F-1642507318663)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220109200756940.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rdOlsOf-1642507318664)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220109200747587.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HzHo7gi-1642507318664)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110050547453.png)]
mvc原理初理解
-
<!--1.注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求:(不包括.jsp)--> <!--/* 匹配所有的请求 : (包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--视图解析器:DispacherServlet给他的ModelAndview--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> <!--Handler--> <bean id="/hello" class="com.yao.controller.HelloController"/> </beans>
-
public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //ModelAndView 模型和视图 ModelAndView mv = new ModelAndView(); //封装对象,放在Modeandview中 ,model mv.addObject("msg","HelloMVC"); //封装要跳转的视图,放在modelandview中 mv.setViewName("hello");//WEB-INF/jsp/hello.jsp return mv; } }
-
<body> ${msg} </body>
-
SpringMVC 中处理器映射器 HandlerMapping 根据配置找到相应的 Handler,返回给前端控制器 DispatcherServlet,前端控制器再传给处理器适配器让它进行处理,处理器适配器会去找到对应的 Handler 去处理,处理后则就会返回一个 ModleAndView 对象。
模型:模型装数据
视图:视图负责转发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eGwJ4GVa-1642507318664)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110053423990.png)]
我觉得原理就是,web.xml下注册dispacherservlet,它会匹配所有路径都经过他,然后他会绑定一个配置文件,文件写了处理器适配器,然后把controller注册在这个配置中,id为他匹配的路径,然后处理器会查找这个路径并且执行,controller执行的结果会返回给配置中的视图解析器,视图解析器分析前缀后缀然后返回给dispacherservlet。
处理器映射器会把得到的id返回给dispacherservlet查看是否在他的路径中,如果在,就会返回给处理器适配器,然后去执行这个路径下的方法,然后return给视图解析器然后交给dispacher返回前端
springMVC注解实现开发
dispacher注册的配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsRS9MkP-1642507318665)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110190750628.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIDYZ0sc-1642507318665)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110185853041.png)]
总
-
<!--1.注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求:(不包括.jsp)--> <!--/* 匹配所有的请求 : (包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd "> <context:component-scan base-package="com.yao.controller"/> //静态资源过滤 <mvc:default-servlet-handler/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>
-
@Controller//代表这个类会被Spring接管 //被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析 public class annoController { @RequestMapping("/h1") public String model(Model model){ model.addAttribute("msg","hello,annocationspringmvc");//封装数据 return "test";//会被视图解析器 } @RequestMapping("/h2") public String mode22(Model model){ model.addAttribute("msg","hello大苏打飒飒打撒gmvc");//封装数据 return "test";//会被视图解析器 } //可以实现视图的复用,jsp页面的复用 }
Controller配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnpbAxCy-1642507318666)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110225708687.png)]
实现controller接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4mx5OY1q-1642507318666)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110230307908.png)]
注解实现controller
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8tQZwCn-1642507318666)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110230200289.png)]
//实现controller接口,springmvc-serlvte中不用写注解实现,只需要把这个类注册到bean中
public class controller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型的对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","hellocontroller");
mv.setViewName("test");
return mv;
}
}
<context:component-scan base-package="com.yao.controllertest"/>
<!--使用这种方式可以不用写映射器的额注解,只需要写扫描包-->
<!--<mvc:default-servlet-handler/>
<mvc:annotation-driven/>-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<bean id="/test" class="com.yao.controllertest.controller"/>
该方法通过实现controller接口实现
RequestMapping
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3MAwvt1-1642507318667)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110232817368.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IctX6TbO-1642507318667)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110233241260.png)]
RestFull风格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUTJCQay-1642507318668)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220111142613123.png)]
@Controller
public class RestFullController {
//原来的 : http://localhost:8080/add?a=1&b=2
//RestFull : http://localhost:8080/add/a/b
//指定以某种请求提交
//http://localhost:8080/add/1/3
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","数值为"+res);
return "test";
}
//post方式提交
@PostMapping("/add/{a}/{b}")
public String test1(@PathVariable int a, @PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","结果1"+res);
return "test";
}
//get方式提交
/* @GetMapping("/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","结果2"+res);
return "test";
}*/
ModelandView
在视图的跳转中,我们通常使用视图解析器设置前缀后缀,然后在实体类中设施model对象,return返回。
我们也可以像以前一样,使用req,resp的方式 ,使用重定向或者转发的方式
没有视图解析得情况下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MGzWUq1-1642507318668)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220111195641087.png)]
重定向地址栏发生变化,请求转发不会。
有视图解析器的情况下,默认是转发,需要加redirect会重定向。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F0jEfJzs-1642507318668)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220111200107731.png)]
SpirngMVC:数据处理
获取前端的参数三种方式:
1.ModelAndView
//实现controller接口,springmvc-serlvte中不用写注解实现,只需要把这个类注册到bean中
public class controller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型的对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","hellocontroller");
mv.setViewName("test");
return mv;
}
一般使用实现controller的方式使用
2.model
@RequestMapping("/t1")
//如果定义的对象为前段传来的参数,最好加个注解 @RequestParam("")
public String test1(@RequestParam("username") String name, Model model){
//1.接收前端的参数
System.out.println("接收到的前端参数为:"+name);
//2.将返回的数据结果返回给前端
model.addAttribute("msg",name);
return "test";
}
一般使用注解@controller使用
在浏览器上方拼接即可
3.modelmap
一般使用注解@controller使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3e1MGy7-1642507318669)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112014103640.png)]
LinkedHashMap
ModelMap : 继承了LinkedHashMap,所以他拥有LinkedHashMap的所有功能!
Model : 精简版(大部分情况,我们都是用model)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWNPCxNP-1642507318669)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112013133571.png)]
@Controller
@RequestMapping("/user")
public class Usercontroller {
//http://localhost:8080/user/t1?name=dasdsa
@RequestMapping("/t1")
//如果定义的对象为前段传来的参数,最好加个注解 @RequestParam("")
public String test1(@RequestParam("username") String name, Model model){
//1.接收前端的参数
System.out.println("接收到的前端参数为:"+name);
//2.将返回的数据结果返回给前端
model.addAttribute("msg",name);
return "test";
}
//http://localhost:8080/user/t2?id=1&name=dsadas&age=18
//前端接受的是一个对象 : id name age
/*
1.接收前端用户传递的参数的时候,判断参数的名字,假设名字直接在方法上,可以直接使用
2.假设传递的是一个对象User,匹配user对象的字段名:如果名字一致则ok,否则,匹配不到
* */
@GetMapping("/t2")
public String test2(User user){
System.out.println(user);
return "test";
}
//这是三种提交到前段的方式
@GetMapping("/t3")
public String test3(ModelMap modelMap){
modelMap.addAttribute("msg","实闲了");
return "test";
}
}
SpirngMVC的乱码问题
官方的过滤器,我们可以直接使用
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
测试
<form action="/t1" method="post">
<input type="text" name="name">
<input type="submit">
</form>
@Controller
public class EncodingController {
//req,resp,显然不能解决乱码,所以我们需要用到过滤器Filter
//springmvc官方已经给了一个过滤器让我们使用解决乱码
@PostMapping("/t1")
public String Endcoding(String name,Model model){
model.addAttribute("msg",name);
return "test";
}
}
3.如果是get请求,我们可以自己手动写一个过滤器来实现乱码问题的解决,当然也可以用官方提供的
SpirngMVC:JSON
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QM9uIOqq-1642507318669)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112021037462.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRwA2QsY-1642507318670)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112021755445.png)]
@Controller
public class UserController {
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
public String json1() throws JsonProcessingException {
//jackson , ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("樱桃",3,"男");
String str =mapper.writeValueAsString(user);
return str;
}
}
如果出现乱码
@RequestMapping(value = “/j1”,produces = “application/json;charset=utf-8”)
可解决
JSON乱码问题配置:
<!--springmvc 统一解决json中文乱码问题-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@ResponseBody
加了该注解它就不会走视图解析器,会直接返回一个字符串。
@RestController
效果也是一样,不会走视图解析器,返回的是字符串
三种方式获取json对象
@RestController
public class UserController {
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
public String json1() throws JsonProcessingException {
//jackson , ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("樱桃",3,"男");
String str =mapper.writeValueAsString(user);
return str;
}
@RequestMapping(value = "/j2",produces = "application/json;charset=utf-8")
public String json() throws JsonProcessingException {
//jackson , ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
List<User> userList = new ArrayList<>();
User user = new User("樱桃",3,"男");
User user1 = new User("樱桃1",4,"男");
User user2= new User("樱桃2",6,"男");
User user3 = new User("樱桃3",5,"男");
userList.add(user);
userList.add(user1);
userList.add(user2);
userList.add(user3);
System.out.println(userList);
String str =mapper.writeValueAsString(userList);
return str;
}
@RequestMapping(value = "/j3",produces = "application/json;charset=utf-8")
public String json2() throws JsonProcessingException {
//jackson , ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//使用oBJECTmapper 来格式化
mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);
//这种方式是在date方法上进行定义还有一种使用在mapper上定义
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(sdf);
//sdf.format(date)
//创建一个对象
Date date = new Date();
return mapper.writeValueAsString(date);
}
创建一个工具类
package com.yao.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
public class jsonUtils {
public static String getJson(Object o) throws JsonProcessingException {
return getJson(o,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Object o,String dateFormat) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);
//这种方式是在date方法上进行定义还有一种使用在mapper上定义
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
mapper.setDateFormat(sdf);
return mapper.writeValueAsString(o);
}
}
@RequestMapping(value = "/j2",produces = "application/json;charset=utf-8")
public String json() throws JsonProcessingException {
//创建一个对象
List<User> userList = new ArrayList<>();
User user = new User("樱桃",3,"男");
User user1 = new User("樱桃1",4,"男");
User user2= new User("樱桃2",6,"男");
User user3 = new User("樱桃3",5,"男");
userList.add(user);
userList.add(user1);
userList.add(user2);
userList.add(user3);
return jsonUtils.getJson(userList);
}
@RequestMapping(value = "/j3",produces = "application/json;charset=utf-8")
public String json2() throws JsonProcessingException {
Date date = new Date();
return jsonUtils.getJson(date,"yyyy-MM-dd HH:mm:ss");
}
之后的方法变得特别简单,上诉方法也实现了代码的复用,我们有养成这样的思想。
阿里巴巴 fastjson
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRVjaIUA-1642507318670)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220113205638440.png)]
ajax
ajax是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术
JQuery是一个库:js的大量函数(方法)
HTML + CSS 略懂 + js (超级熟练)
js:
- 函数 闭包()()自己掉自己
- Dom
- id,name,tag
- create,remove
- Bom
- windos
- document
Es6:impoort require
拦截器
拦截器只拦截controller请求,不拦截静态资源。
我们所有WEB-INF下的资源,都需要通过controller层去调用,不能直接去访问。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CawWq3Hb-1642507318670)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220117013450843.png)]
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--包括这个请求下面的所有的请求-->
<mvc:mapping path="/**"/>
<bean class="com.yao.controller.Myinterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
package com.yao.controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Myinterceptor implements HandlerInterceptor {
//return true;执行下一个拦截器,放行
//return false;不执行下一个拦截器
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("=========处理前========");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("=========处理后========");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("=========结束清理========");
}
}
=========处理前========
interceptor方法执行了
=========处理后========
=========结束清理========
登录验证案例:
首先写三个jsp页面:
<body>
<h1><a href="${pageContext.request.contextPath}/user/goLogin">登陆页面</a></h1>
<h1><a href="${pageContext.request.contextPath}/user/main">首页</a></h1>
</body>
首页
<span>${username}</span>
<p>
<a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>
<form action="${pageContext.request.contextPath}/user/login" method="post">
<p>
账号:<input type="text" name="username">
</p>
<p>
密码:<input type="text" name="password">
</p>
<input type="submit" value="提交">
</form>
Controller层
package com.yao.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/user")
public class LoginController {
@RequestMapping("/main")
public String main(){
return "main";
}
@RequestMapping("/goLogin")
public String login(){
return "login";
}
//输入账号密码 提交用的
@RequestMapping("/login")
public String login(HttpSession session, String username, String password, Model model){
//把用户信息存在session中
session.setAttribute("userLoginInfo",username);
model.addAttribute("username",username);
return "main";
}
//注销操作
@RequestMapping("/goOut")
public String goOut(HttpSession session){
//把用户信息存在session中
//session.invalidate(); 销毁session
session.removeAttribute("userLoginInfo"); //移除session
return "main";
}
}
拦截器
public class Logininterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("======处理了=======");
HttpSession session = request.getSession();
//放行 : 判断什么情况下放行
//登陆页面也得放行,,含有login的路径
if(request.getRequestURI().contains("goLogin")){
return true;
}
//第一次登陆的原因,没有session,所以点击登录也会被拦截
if(request.getRequestURI().contains("login")){
return true;
}
//第一次登陆的原因,没有session,所以点击登录也会被拦截
if(session.getAttribute("userLoginInfo")!=null){
return true;
}
//判断什么情况下没有登陆
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
配置
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--包括这个请求下面的所有的请求-->
<!-- /book/a1 /book/a2 这种类似 -->
<mvc:mapping path="/user/**"/>
<bean class="com.yao.config.Logininterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
总体思想就是只有登录相关的页面,我们才会放行,其他无关的一律不放行,在登录得到session的时候,所有请求都会放行。
//登陆页面也得放行,含有login的路径
if(request.getRequestURI().contains(“goLogin”)){
return true;
}
//第一次登陆的原因,没有session,所以点击登录也会被拦截
if(request.getRequestURI().contains("login")){
return true;
}
//第一次登陆的原因,没有session,所以点击登录也会被拦截
if(session.getAttribute("userLoginInfo")!=null){
return true;
}
//判断什么情况下没有登陆
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
配置
```xml
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--包括这个请求下面的所有的请求-->
<!-- /book/a1 /book/a2 这种类似 -->
<mvc:mapping path="/user/**"/>
<bean class="com.yao.config.Logininterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
总体思想就是只有登录相关的页面,我们才会放行,其他无关的一律不放行,在登录得到session的时候,所有请求都会放行。