统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:151 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 springmvc

spring5mvc第二天【大纲笔记】

梦幻书涯
首页 springmvc 正文


SpringMVC第二天

第1章响应数据和结果视图

1.1返回值分类

1.1.1字符串

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/pages/success.jsp

@RequestMapping("/testReturnString")

public String testReturnString() {

System.out.println("AccountController的testReturnString方法执行了。。。。");

return  "success";

}

运行结果:

1.1.2  void

在昨天的学习中,我们知道Servlet原始API可以作为控制器中方法的参数:

@RequestMapping("/testReturnVoid")

publicvoidtestReturnVoid(HttpServletRequestrequest,HttpServletResponseresponse)

throws Exception {

}

在controller方法形参上可以定义request和response,使用request或response指定响应结果:

1、使用request转向页面,如下:


request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,

response);

2、也可以通过response页面重定向:

response.sendRedirect("testRetrunString")

3、也可以通过response指定响应结果,例如响应json数据:

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

1.1.3  ModelAndView

ModelAndView是SpringMVC为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

该对象中有两个方法:

示例代码:

/**

*返回ModeAndView

*  @return

*/

@RequestMapping("/testReturnModelAndView")

public ModelAndView testReturnModelAndView() {

ModelAndView mv = new  ModelAndView();

mv.addObject("username", "张三");

mv.setViewName("success");

return  mv;

}

响应的jsp代码:

<%@

page

language="java"

contentType="text/html;

charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE

html

PUBLIC

"-//W3C//DTD

HTML

4.01

Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>执行成功</title>

</head>

<body>

执行成功!

${requestScope.username}

</body>

</html>

输出结果:

注意:

我们在页面上上获取使用的是requestScope.username取的,所以返回ModelAndView类型时,浏

览器跳转只能是请求转发。

1.2转发和重定向

1.2.1  forward转发

controller方法在提供了String类型的返回值之后,默认就是请求转发。我们也可以写成:

/**

*转发

*  @return

*/

@RequestMapping("/testForward")

public String testForward() {

System.out.println("AccountController的testForward方法执行了。。。。");


return  "forward:/WEB-INF/pages/success.jsp";

}

需要注意的是,如果用了formward:则路径必须写成实际视图url,不能写逻辑视图。

它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用请求

转发,既可以转发到jsp,也可以转发到其他的控制器方法。

1.2.2  Redirect重定向

contrller方法提供了一个String类型返回值之后,它需要在返回值里使用:redirect:

/**

*重定向

*  @return

*/

@RequestMapping("/testRedirect")

public String testRedirect() {

System.out.println("AccountController的testRedirect方法执行了。。。。");

return  "redirect:testReturnModelAndView";

}

它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到jsp页面,则jsp页面不

能写在WEB-INF目录中,否则无法找到。

1.3ResponseBody响应  json数据

1.3.1使用说明

作用:

该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的

数据如:json,xml等,通过Response响应给客户端

1.3.2使用示例

需求:

使用@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端。

前置知识点:

Springmvc默认用  MappingJacksonHttpMessageConverter对  json数据进行转换,需要加入

jackson的包。

注意:2.7.0以下的版本用不了


jsp中的代码:

<script

type="text/javascript"

src="${pageContext.request.contextPath}/js/jquery.min.js"></script>

<script type="text/javascript">

$(function(){

$("#testJson").click(function(){

$.ajax({

type:"post",

url:"${pageContext.request.contextPath}/testResponseJson",

contentType:"application/json;charset=utf-8",

data:'{"id":1,"name":"test","money":999.0}',

dataType:"json",

success:function(data){

alert(data);

}

});

});

})

</script>

<!--测试异步请求  -->

<input type="button" value="测试 ajax请求  json和响应  json" id="testJson"/>

控制器中的代码:

/**

*响应json数据的控制器

* @author黑马程序员

* @Company  http://www.ithiema.com

* @Version  1.0

*/

@Controller("jsonController")

public class JsonController {

/**

*测试响应json数据

*/

@RequestMapping("/testResponseJson")

public @ResponseBody Account testResponseJson(@RequestBody Account account)  {

System.out.println("异步请求:"+account);

return  account;

}

}

运行结果:


第2章 SpringMVC实现文件上传

2.1文件上传的回顾

2.1.1文件上传的必要前提

A form表单的enctype取值必须是:multipart/form-data

(默认值是:application/x-www-form-urlencoded)

enctype:是表单请求正文的类型

B method属性取值必须是Post

C提供一个文件选择域<input  type=”file”  />

2.1.2文件上传的原理分析

当form表单的enctype取值不是默认值后,request.getParameter()将失效。

enctype=”application/x-www-form-urlencoded”时,form表单的正文内容是:

key=value&key=value&key=value

当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成:

每一部分都是MIME类型描述的正文

-----------------------------7de1a433602ac

分界符

协议头

Content-Disposition: form-data; name="userName"

aaa 

协议的正文

-----------------------------7de1a433602ac

Content-Disposition:

form-data;

name="file";

filename="C:UserszhyDesktopfileupload_demofileb.txt"

Content-Type: text/plain 

协议的类型(MIME类型)

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

-----------------------------7de1a433602ac--

2.1.3借助第三方组件实现文件上传

使用 Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑  jar包:Commons-fileupload和

commons-io。commons-io不属于文件上传组件的开发jar文件,但Commons-fileupload组件从1.1版本开始,它

工作时需要commons-io包的支持。

2.2springmvc传统方式的文件上传

2.2.1说明

传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。

并且上传完成之后,浏览器可能跳转。

2.2.2实现步骤

2.2.2.1第一步:拷贝文件上传的  jar包到工程的   lib目录


2.2.2.2第二步:编写  jsp页面

<form action="/fileUpload" method="post" enctype="multipart/form-data">

名称:<input type="text" name="picname"/><br/>

图片:<input type="file" name="uploadFile"/><br/>

<input type="submit" value="上传"/>

</form>

2.2.2.3第三步:编写控制器

/**

*文件上传的的控制器

*  @author黑马程序员

*  @Company  http://www.ithiema.com

*  @Version  1.0

*/

@Controller("fileUploadController")

public  class FileUploadController {

/**

*文件上传

*/

@RequestMapping("/fileUpload")

public

String

testResponseJson(String

picname,MultipartFile

uploadFile,HttpServletRequest request)  throws  Exception{

//定义文件名

String fileName =  "";

//1.获取原始文件名

String uploadFileName =  uploadFile.getOriginalFilename();

//2.截取文件扩展名

String

extendName

=

uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,

uploadFileName.length());

//3.把文件加上随机数,防止文件重复

Stringuuid=UUID.randomUUID().toString().replace("-","").toUpperCase();

//4.判断是否输入了文件名

if(!StringUtils.isEmpty(picname)) {

fileName =  uuid+"_"+picname+"."+extendName;

}else  {

fileName =  uuid+"_"+uploadFileName;

}

System.out.println(fileName);

//2.获取文件路径


ServletContext context =  request.getServletContext();

String basePath =  context.getRealPath("/uploads");

//3.解决同一文件夹中文件过多问题

String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new  Date());

//4.判断路径是否存在

File file = new  File(basePath+"/"+datePath);

if(!file.exists()) {

file.mkdirs();

}

//5.使用MulitpartFile接口中方法,把上传的文件写到指定位置

uploadFile.transferTo(new  File(file,fileName));

return  "success";

}

}

2.2.2.4第四步:配置文件解析器

<!--配置文件上传解析器  -->

<bean id="multipartResolver" <!-- id的值是固定的-->

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!--设置上传文件的最大尺寸为5MB  -->

<property name="maxUploadSize">

<value>5242880</value>

</property>

</bean>

注意:

文件上传的解析器id是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他

字段也将无法绑定)

2.3springmvc跨服务器方式的文件上传

2.3.1分服务器的目的

在实际开发中,我们会有很多处理不同功能的服务器。例如:

应用服务器:负责部署我们的应用

数据库服务器:运行我们的数据库

缓存和消息服务器:负责处理大并发访问的缓存和消息

文件服务器:负责存储用户上传文件的服务器。

(注意:此处说的不是服务器集群)


分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

2.3.2准备两个    tomcat服务器,并创建一个用于存放图片的  web工程

在文件服务器的tomcat配置中加入,允许读写操作。文件位置:

加入内容:


加入此行的含义是:接收文件的目标服务器可以支持写入操作。

2.3.3拷贝   jar包

在我们负责处理文件上传的项目中拷贝文件上传的必备jar包

2.3.4编写控制器实现上传图片

/**

*响应json数据的控制器

*  @author黑马程序员

*  @Company  http://www.ithiema.com

*  @Version  1.0

*/

@Controller("fileUploadController2")

public  class FileUploadController2 {

public

static

final

String

FILESERVERURL

=

"http://localhost:9090/day06_spring_image/uploads/";

/**

*文件上传,保存文件到不同服务器

*/

@RequestMapping("/fileUpload2")

public String testResponseJson(String picname,MultipartFile uploadFile)  throws


Exception{

//定义文件名

String fileName =  "";

//1.获取原始文件名

String uploadFileName =  uploadFile.getOriginalFilename();

//2.截取文件扩展名

String

extendName

=

uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,

uploadFileName.length());

//3.把文件加上随机数,防止文件重复

Stringuuid=UUID.randomUUID().toString().replace("-","").toUpperCase();

//4.判断是否输入了文件名

if(!StringUtils.isEmpty(picname)) {

fileName =  uuid+"_"+picname+"."+extendName;

}else  {

fileName =  uuid+"_"+uploadFileName;

}

System.out.println(fileName);

//5.创建sun公司提供的jersey包中的Client对象

Client client = Client.create();

//6.指定上传文件的地址,该地址是web路径

WebResource resource = client.resource(FILESERVERURL+fileName);

//7.实现上传

String result = resource.put(String.class,uploadFile.getBytes());

System.out.println(result);

return  "success";

}

}

2.3.5编写   jsp页面

<form action="fileUpload2" method="post" enctype="multipart/form-data">

名称:<input type="text" name="picname"/><br/>

图片:<input type="file" name="uploadFile"/><br/>

<input type="submit" value="上传"/>

</form>

2.3.6配置解析器

<!--配置文件上传解析器  -->

<bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!--设置上传文件的最大尺寸为5MB  -->


<property name="maxUploadSize">

<value>5242880</value>

</property>

</bean>

第3章 SpringMVC中的异常处理

3.1异常处理的思路

系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,

后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

系统的dao、service、controller出现都通过throwsException向上抛出,最后由springmvc前端

控制器交由异常处理器进行异常处理,如下图:

客户端

请求

异常

异常

HandlerExceptionResolver

Springmvc

异常处理器

DispatcherServlet

Controller

Service

Dao

异常

3.2实现步骤

3.2.1编写异常类和错误页面

/**

*自定义异常


* @author黑马程序员

* @Company  http://www.ithiema.com

* @Version  1.0

*/

public class CustomException extends Exception {

private String  message;

public CustomException(String message)  {

this.message =  message;

}

public String getMessage() {

return  message;

}

}

jsp页面:

<%@

page

language="java"

contentType="text/html;

charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE

html

PUBLIC

"-//W3C//DTD

HTML

4.01

Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>执行失败</title>

</head>

<body>

执行失败!

${message }

</body>

</html>

3.2.2自定义异常处理器

/**

*自定义异常处理器

* @author黑马程序员

* @Company  http://www.ithiema.com

* @Version  1.0

*/

public class CustomExceptionResolver implements HandlerExceptionResolver {

@Override


public ModelAndView resolveException(HttpServletRequest  request,

HttpServletResponse response, Object handler, Exception ex)  {

ex.printStackTrace();

CustomException customException =  null;

//如果抛出的是系统自定义异常则直接转换

if(ex  instanceof  CustomException){

customException = (CustomException)ex;

}else{

//如果抛出的不是系统自定义异常则重新构造一个系统错误异常。

customException =  new CustomException("系统错误,请与系统管理员联系!");

}

ModelAndView modelAndView =  new  ModelAndView();

modelAndView.addObject("message", customException.getMessage());

modelAndView.setViewName("error");

return  modelAndView;

}

}

3.2.3配置异常处理器

<!--配置自定义异常处理器  -->

<bean id="handlerExceptionResolver"

class="com.itheima.exception.CustomExceptionResolver"/>

3.2.4运行结果:


第4章 SpringMVC中的拦截器

4.1拦截器的作用

Spring MVC的处理器拦截器类似于   Servlet开发中的过滤器  Filter,用于对处理器进行预处理和后处理。

用户可以自己定义一些拦截器来实现特定的功能。

谈到拦截器,还要向大家提一个词——拦截器链(InterceptorChain)。拦截器链就是将拦截器按一定的顺

序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

说到这里,可能大家脑海中有了一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但

是也有区别,接下来我们就来说说他们的区别:

过滤器是servlet规范中的一部分,任何java  web工程都可以使用。

拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image或者js是不会进行拦

截的。

它也是AOP思想的具体应用。

我们要想自定义拦截器,要求必须实现:HandlerInterceptor接口。

4.2自定义拦截器的步骤

4.2.1第一步:编写一个普通类实现    HandlerInterceptor接口

/**

*自定义拦截器

* @author黑马程序员

* @Company  http://www.ithiema.com

* @Version  1.0

*/

public class HandlerInterceptorDemo1 implements HandlerInterceptor {

@Override

public  boolean  preHandle(HttpServletRequest  request,  HttpServletResponse

response, Object  handler)

throws Exception {

System.out.println("preHandle拦截器拦截了");

return true;

}

@Override

publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,

Object  handler,


ModelAndView modelAndView)  throws Exception {

System.out.println("postHandle方法执行了");

}

@Override

public   void afterCompletion(HttpServletRequest request,   HttpServletResponse

response, Object handler, Exception  ex)

throws Exception {

System.out.println("afterCompletion方法执行了");

}

}

4.2.2第二步:配置拦截器

<!--配置拦截器  -->

<mvc:interceptors>

<mvc:interceptor>

<mvc:mapping path="/**"/>

<bean id="handlerInterceptorDemo1"

class="com.itheima.web.interceptor.HandlerInterceptorDemo1"></bean>

</mvc:interceptor>

</mvc:interceptors>

4.2.3测试运行结果:


4.3拦截器的细节

4.3.1拦截器的放行

放行的含义是指,如果有下一个拦截器就执行下一个,如果该拦截器处于拦截器链的最后一个,则执行控制器

中的方法。

4.3.2拦截器中方法的说明

public interface HandlerInterceptor {

/**

*如何调用:

*

按拦截器定义顺序调用

*何时调用:

*

只要配置了都会调用

*有什么用:

*

如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去

*

进行处理,则返回true。

*

如果程序员决定不需要再调用其他的组件去处理请求,则返回false。

*/

default  boolean preHandle(HttpServletRequest  request,  HttpServletResponse

response, Object handler)

throws Exception {

return true;

}


/**

*如何调用:

*

按拦截器定义逆序调用

*何时调用:

*

在拦截器链内所有拦截器返成功调用

*有什么用:

*

在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,

在该方法中对用户请求request进行处理。

*

*/

default

void

postHandle(HttpServletRequest

request,  HttpServletResponse

response, Object handler,

@Nullable ModelAndView modelAndView) throws Exception {

}

/**

*如何调用:

*

按拦截器定义逆序调用

*何时调用:

*

只有preHandle返回true才调用

*有什么用:

*

在 DispatcherServlet完全处理完请求后被调用,

*

可以在该方法中进行一些资源清理的操作。

*/

default void afterCompletion(HttpServletRequest request, HttpServletResponse

response, Object handler,

@Nullable Exception ex) throws Exception {

}

}

思考:

如果有多个拦截器,这时拦截器1的preHandle方法返回true,但是拦截器2的preHandle方法返

回false,而此时拦截器1的afterCompletion方法是否执行?

4.3.3拦截器的作用路径

作用路径可以通过在配置文件中配置。

<!--配置拦截器的作用范围  -->

<mvc:interceptors>

<mvc:interceptor>

<mvc:mapping path="/**" /><!--用于指定对拦截的url   -->

<mvc:exclude-mapping path=""/><!--用于指定排除的url-->

<bean id="handlerInterceptorDemo1"

class="com.itheima.web.interceptor.HandlerInterceptorDemo1"></bean>

</mvc:interceptor>

</mvc:interceptors>


4.3.4多个拦截器的执行顺序

多个拦截器是按照配置的顺序决定的。

4.4正常流程测试

4.4.1配置文件:

<!--配置拦截器的作用范围  -->

<mvc:interceptors>

<mvc:interceptor>


<mvc:mapping path="/**" /><!--用于指定对拦截的url   -->

<bean

id="handlerInterceptorDemo1"

class="com.itheima.web.interceptor.HandlerInterceptorDemo1"></bean>

</mvc:interceptor>

<mvc:interceptor>

<mvc:mapping path="/**"  />

<bean

id="handlerInterceptorDemo2"

class="com.itheima.web.interceptor.HandlerInterceptorDemo2"></bean>

</mvc:interceptor>

</mvc:interceptors>

4.4.2拦截器   1的代码:

/**

*自定义拦截器

*  @author黑马程序员

*  @Company  http://www.ithiema.com

*  @Version  1.0

*/

public  class HandlerInterceptorDemo1  implements HandlerInterceptor {

@Override

public

boolean  preHandle(HttpServletRequest  request,  HttpServletResponse

response, Object  handler)

throws Exception {

System.out.println("拦截器1:preHandle拦截器拦截了");

return  true;

}

@Override

public voidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,

Object  handler,

ModelAndView modelAndView)  throws Exception {

System.out.println("拦截器1:postHandle方法执行了");

}

@Override

public   void afterCompletion(HttpServletRequest request,   HttpServletResponse

response, Object handler, Exception  ex)

throws Exception {

System.out.println("拦截器1:afterCompletion方法执行了");

}

}


4.4.3拦截器   2的代码:

/**

*自定义拦截器

*  @author黑马程序员

*  @Company  http://www.ithiema.com

*  @Version  1.0

*/

public  class HandlerInterceptorDemo2  implements HandlerInterceptor {

@Override

public

boolean  preHandle(HttpServletRequest  request,

response, Object  handler)

throws Exception {

HttpServletResponse

System.out.println("拦截器2:preHandle拦截器拦截了");

return  true;

}

@Override

public voidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,

Object  handler,

ModelAndView modelAndView)  throws Exception {

System.out.println("拦截器2:postHandle方法执行了");

}

@Override

public   void afterCompletion(HttpServletRequest request,   HttpServletResponse

response, Object handler, Exception  ex)

throws Exception {

System.out.println("拦截器2:afterCompletion方法执行了");

}

}

4.4.4运行结果:


4.5中断流程测试

4.5.1配置文件:

<!--配置拦截器的作用范围  -->

<mvc:interceptors>

<mvc:interceptor>

<mvc:mapping path="/**" /><!--用于指定对拦截的url   -->

<bean id="handlerInterceptorDemo1"

class="com.itheima.web.interceptor.HandlerInterceptorDemo1"></bean>

</mvc:interceptor>

<mvc:interceptor>

<mvc:mapping path="/**"  />

<bean id="handlerInterceptorDemo2"

class="com.itheima.web.interceptor.HandlerInterceptorDemo2"></bean>

</mvc:interceptor>

</mvc:interceptors>

4.5.2拦截器   1的代码:

/**

*自定义拦截器

*  @author黑马程序员

*  @Company  http://www.ithiema.com

*  @Version  1.0

*/

public  class HandlerInterceptorDemo1  implements HandlerInterceptor {

@Override

public

boolean  preHandle(HttpServletRequest  request,  HttpServletResponse

response, Object  handler)

throws Exception {

System.out.println("拦截器1:preHandle拦截器拦截了");

return  true;

}

@Override

public voidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,

Object  handler,

ModelAndView modelAndView)  throws Exception {

System.out.println("拦截器1:postHandle方法执行了");

}


@Override

public void  afterCompletion(HttpServletRequest request,  HttpServletResponse

response, Object handler, Exception  ex)

throws Exception {

System.out.println("拦截器1:afterCompletion方法执行了");

}

}

4.5.3拦截器   2的代码:

/**

*自定义拦截器

* @author黑马程序员

* @Company  http://www.ithiema.com

* @Version  1.0

*/

public class HandlerInterceptorDemo2 implements HandlerInterceptor {

@Override

public  boolean  preHandle(HttpServletRequest  request,  HttpServletResponse

response, Object  handler)

throws Exception {

System.out.println("拦截器2:preHandle拦截器拦截了");

return false;

}

@Override

publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,

Object  handler,

ModelAndView modelAndView) throws Exception {

System.out.println("拦截器2:postHandle方法执行了");

}

@Override

public void  afterCompletion(HttpServletRequest request,  HttpServletResponse

response, Object handler, Exception  ex)

throws Exception {

System.out.println("拦截器2:afterCompletion方法执行了");

}

}


4.5.4运行结果:

4.6拦截器的简单案例(验证用户是否登录)

4.6.1实现思路

1、有一个登录页面,需要写一个controller访问页面

2、登录页面有一提交表单的动作。需要在controller中处理。

2.1、判断用户名密码是否正确

2.2、如果正确向session中写入用户信息

2.3、返回登录成功。

3、拦截用户请求,判断用户是否登录

3.1、如果用户已经登录。放行

3.2、如果用户未登录,跳转到登录页面

4.6.2控制器代码

//登陆页面

@RequestMapping("/login")

public String login(Model model)throws  Exception{

return  "login";

}

//登陆提交

//userid:用户账号,pwd:密码

@RequestMapping("/loginsubmit")

public  String loginsubmit(HttpSession  session,String userid,String  pwd)throws

Exception{

//向session记录用户身份信息

session.setAttribute("activeUser", userid);

return  "redirect:/main.jsp";

}


//退出

@RequestMapping("/logout")

public String logout(HttpSession session)throws  Exception{

//session过期

session.invalidate();

return  "redirect:index.jsp";

}

4.6.3拦截器代码

public class LoginInterceptor implements  HandlerInterceptor{

@Override

Public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

//如果是登录页面则放行

if(request.getRequestURI().indexOf("login.action")>=0){

return true;

}

HttpSession session = request.getSession();

//如果用户已登录也放行

if(session.getAttribute("user")!=null){

return true;

}

//用户没有登录挑战到登录页面

request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,

response);

return false;

}

}

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

这篇文章最后更新于2020-10-5,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
spring5mvc第三天【大纲笔记】
« 上一篇
spring5mvc第一天【大纲笔记】
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
Array

日历

热门文章