Spring MVC代码实例系列( 二 )


.java用来返回json信息 。
public class JsonResult {private Integer code = 1;private String message = "success!";//constructor/toString/setter/getter}
.java用来模拟登录登出
package pers.hanchao.hespringmvc.interceptors;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.PostMapping;import javax.servlet.http.HttpServletRequest;/*** Created by 韩超 on 2018/1/23.*/@Controllerpublic class LoginController {/*** Title: 模拟造数,用于登录session
* @author 韩超@bksx 2018/1/24 17:54*/@ModelAttributepublic User init(){User user = new User();user.setUsername("张三");user.setPassword("password");return user;}/*** Title: 简单的登录演示
* @author 韩超@bksx 2018/1/24 17:55*/@PostMapping("/login")public String login(HttpServletRequest request, @ModelAttribute User user, Model model){request.getSession().setAttribute("username",user.getUsername());model.addAttribute("username",user.getUsername());return "/index";}/*** Title: 简单的登出演示
* @author 韩超@bksx 2018/1/24 17:55*/@PostMapping("/logout")public String logout(HttpServletRequest request){request.getSession().setAttribute("username","");return "/login";}}

2.4.

Spring MVC代码实例系列

文章插图
3.请求信息打印拦截器
实现思路:
1. 关于方法执行时间,需要首先重写方法记录方执行前的时刻,然后重写方法记录方法执行完的时间,从而计算得出方法执行的时间 。
2. 关于请求的控制器()、请求方法()、请求类型(POST/GET等等)、请求URI(/hello)等信息,只需要重写方法,在方法执行前,通过和获取相关信息 。
3. 关于请求参数,不能简略的只是重写方法,从.获取参数就可以了 。因为.只能获取一次参数,如果在拦截器里获取了这些参数并且不做其他处理,则到了方法的执行阶段,无法获取任何的body部分的参数 。为了解决这个问题,引入了[包装器]和[过滤器]技术,通过包装器,将的body数据取出来进行包装,使得能够多次被执行 。通过lter实现的包装过程 。
3.1.的body信息包装器-
.java通过继承apper,重写和实现了对请求的包装,将body数据提取出来放入byte数组中,从而实现中body数据的多次使用 。
package pers.hanchao.hespringmvc.interceptors.filter;import org.apache.log4j.Logger;import org.apache.log4j.lf5.util.StreamUtils;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStreamReader;/*** Created by 韩超 on 2018/1/25.*/public class RequestBodyWrapper extends HttpServletRequestWrapper {//定义字段保存request的body信息private byte[] requestBody;private final static Logger LOGGER = Logger.getLogger(RequestBodyWrapper.class);/*** Title: 读取request.getInputStream信息,保存到requestBody数组中
* @author 韩超@bksx 2018/1/25 10:40*/public RequestBodyWrapper(HttpServletRequest request) {super(request);try {//将request的body信息写入到requestBody中requestBody = StreamUtils.getBytes(request.getInputStream());} catch (IOException e) {e.printStackTrace();LOGGER.error("[URI=" + request.getRequestURI() + ",method=" + request.getMethod() + "],无法获取body数据!");}}/*** Title:重写getInputStream,返回requestBody数组中的信息
* @author 韩超@bksx 2018/1/25 10:42*/@Overridepublic ServletInputStream getInputStream(){if (null == requestBody){requestBody = new byte[0];}final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);return new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return bais.read();}};}/*** 重写getReader方法,调用getInputStream,将byte[]数组转换成BufferedReader