1.先做个最简单的Get请求

新建一个Controller , 并给他添加注解@RestController 它是@Controller和@ResponseBody的组合注解,告诉Spring我是一个Controller,请求过来的时候,记得扫描我

ok,在给他添加@RequestMapping注解,为这个Controler指明路径

@RestController
@RequestMapping("/Demo")
public class DemoController { @ResponseBody
@RequestMapping(value = "/sayHello",method = RequestMethod.GET)
public Map<String,Object> sayHello(){
Map<String,Object> res = new HashMap<String,Object>();
res.put("message", "hello world");
return res;
}
}

写个Get方法,返回一个Map

右击启动类 run...

2.POST请求的方法

正常在接口请求过程中,中间会有个过滤器,过滤所有请求的内容,同时做一些安全方面的校验

过滤器注册类

@Configuration
public class WebConfig { @Bean
@SuppressWarnings({ "unchecked", "rawtypes" })
public FilterRegistrationBean someFilterRegistration1() {
//新建过滤器注册类
FilterRegistrationBean registration = new FilterRegistrationBean();
//添加出事话过滤器
registration.setFilter( new CustomFilter());
// 设置过滤器的URL模式
registration.addUrlPatterns("/*");
return registration;
} }

@Configuration自动配置,由Spring管理

过滤器注册类中,添加过滤器CustomFilter

过滤器的URL模式设置为过滤所有请求

/**
* 初始化过滤器
* @ClassName: CustomFilter
* @author Mr.Chengjq
* @date 2018年10月16日
* @Description: TODO
*/
@WebFilter(filterName = "sessionFilter",urlPatterns = {"/*"})
public class CustomFilter implements Filter { private GeneralConfiguration generalConfiguration; @Override
public void destroy() {
// TODO Auto-generated method stub } @SuppressWarnings("unused")
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(false);
String uri = request.getRequestURI();
//是否需要过滤
if(!isNeedFilter(uri)){
filterChain.doFilter(request, response);
return;
}
MutableHttpServletRequest requestWrapper = null;
if(request instanceof HttpServletRequest) {
requestWrapper = new MutableHttpServletRequest((HttpServletRequest) request);
}
String body = getRequestbody(requestWrapper);
//验证 start
//验证方式 1.token验证(头部加 token:xxx) 2.秘钥验证(暂定MD5验证 参数 timestamp:xxx key:MD5(xxx+orange))
if(requestWrapper.getHeader("valdateType").equals("1")){
String token = requestWrapper.getHeader("token");
System.out.println("token = "+token);
}else if(requestWrapper.getHeader("valdateType").equals("2")){
String timestamp = requestWrapper.getHeader("timestamp");
String key = requestWrapper.getHeader("key");
//验证
}else{
//返回验证方式失败信息
throw new BaseException("验证失败");
}
//end
requestWrapper.putHeader("userId", "1111");
if(requestWrapper == null) {
filterChain.doFilter(request, response);
} else {
filterChain.doFilter(requestWrapper, response);
} } private String getRequestbody(HttpServletRequest request) {
String param= null;
try {
BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null)
responseStrBuilder.append(inputStr); JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
param= jsonObject.toJSONString();
} catch (Exception e) {
e.printStackTrace();
}
return param;
} public boolean isNeedFilter(String uri) {
boolean res = true;
String url = generalConfiguration.getUrl();
String[] list = url.split(",");
for(int i = 0 ; i<list.length;i++){
if(uri.indexOf(list[i])!=-1){
res = false;
break;
}
}
return res;
} private class MutableHttpServletRequest extends HttpServletRequestWrapper { private final Map<String, String> customHeaders;
private byte[] body; public MutableHttpServletRequest(HttpServletRequest request) {
super(request);
this.customHeaders = new HashMap<String, String>();
body = getRequestbody(request).getBytes(Charset.forName("UTF-8"));
} public void putHeader(String name, String value) {
this.customHeaders.put(name, value);
} @Override
public String getHeader(String name) {
// check the custom headers first
String headerValue = customHeaders.get(name); if (headerValue != null) {
return headerValue;
}
// else return from into the original wrapped object
return ((HttpServletRequest) getRequest()).getHeader(name); } @Override
public Enumeration<String> getHeaders(String name) { if (customHeaders.containsKey(name)) {
return new Enumeration<String>() {
boolean hasNext = true; @Override
public boolean hasMoreElements() {
return hasNext;
} @Override
public String nextElement() {
hasNext = false;
return customHeaders.get(name);
}
};
}
return super.getHeaders(name);
} @Override
public Enumeration<String> getHeaderNames() {
// create a set of the custom header names
Set<String> set = new HashSet<String>(customHeaders.keySet()); // now add the headers from the wrapped request object
Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
while (e.hasMoreElements()) {
// add the names of the request headers into the list
String n = e.nextElement();
set.add(n);
} // create an enumeration from the set and return
return Collections.enumeration(set);
} @Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
} @Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() { @Override
public int read() throws IOException {
return bais.read();
} @Override
public boolean isFinished() {
// TODO Auto-generated method stub
return false;
} @Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
} @Override
public void setReadListener(ReadListener readListener) {
// TODO Auto-generated method stub }
};
} } @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
//初始化bean 获取公共参数配置
ServletContext servletContext = arg0.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
generalConfiguration = (GeneralConfiguration) ctx.getBean("generalConfiguration");
}

  在doFilter方法里具体写过滤的内容以及验证

isNeedFilter方法确认是否要过滤,如果不需要过滤,配置文件里配置不需要过滤的请求名,

/**
* 公共参数配置类
* @ClassName: GeneralConfiguration
* @author Mr.Chengjq
* @date 2018年10月16日
* @Description: TODO
*/
@PropertySource("classpath:conf/generalConfiguration.properties")
@ConfigurationProperties(prefix = "general")
@Configuration
public class GeneralConfiguration { //请求地址
private String url; public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} }

这里添加参数配置类,获取generalConfiguration.properties配置文件,以general开头,当然还可以以@Value的方式

这里就不需要过滤了,直接在配置文件写明不需要处理下面请求的地址,直接进入Controlle方法

general.url = /sayHello,/sayHello2

sayHello2 方法如下,请求数据库的信息

    @ResponseBody
@RequestMapping(value = "/sayHello2",method = RequestMethod.POST)
public ResponseMsg sayHello2(@RequestHeader("userId") String userId,@RequestBody RequestMsg requestMsg){
System.out.println(userId);
JSONObject jsonobject = JSONObject.fromObject(requestMsg.getRoot());
System.out.println("jsonobject = "+jsonobject);
//Map<String,Object> res = new HashMap<String,Object>();
PageResult<UserBaseDTO> res = null;
List<UserBaseDTO> list = null;
UserBaseDTO ubt = new UserBaseDTO();
try {
StringBuffer logOut = new StringBuffer();
logOut.append("\n");
logOut.append("cjq2测试");
logOut.append("\n"); LOGGER.debug(logOut.toString());
Pagination page = new Pagination();
page.setPage(1);
page.setRows(10);;
res = iUserbaseService.pageUserBase(ubt, page);
list = res.getList(); } catch (Exception e) {
// TODO: handle exception
throw new BaseException("数据错误");
//LOGGER.error(e.getMessage());
}
return new ResponseMsg(requestMsg.getRoute(), GeneralConstant.SUCCESS, "查询成功", res);
}

在正常开发过程中,对请求参数提和返回参数体会有统一的格式和加密方式,例如上面的的RequestMsg和ResponseMsg

ok 这样就完成了简单的GET和POST请求

Spring Boot 简单的请求示例(包括请求体验证)的更多相关文章

  1. Spring Boot全局支持CORS(跨源请求)

    import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet. ...

  2. 玩转spring boot——简单登录认证

    前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...

  3. Spring Boot Ftp Client 客户端示例支持断点续传

    本章介绍 Spring Boot 整合 Ftpclient 的示例,支持断点续传 本项目源码下载 1 新建 Spring Boot Maven 示例工程项目 注意:是用来 IDEA 开发工具 File ...

  4. Spring Boot实现一个监听用户请求的拦截器

    项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承W ...

  5. Spring Boot使用AOP在控制台打印请求、响应信息

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等. AOP简介 AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的 ...

  6. spring Boot使用AOP统一处理Web请求日志记录

    1.使用spring boot实现一个拦截器 1.引入依赖: <dependency>   <groupId>org.springframework.boot</grou ...

  7. spring boot使用AOP统一处理web请求

    为了保证服务的高可用,及时发现问题,迅速解决问题,为应用添加log是必不可少的. 但是随着项目的增大,方法增多,每个方法加单独加日志处理会有很多冗余 那在SpringBoot项目中如何统一的处理Web ...

  8. Spring Boot 2.x 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统

    一.概述 经过HelloWorld示例(Spring Boot 2.x 快速入门(上)HelloWorld示例)( Spring Boot 2.x 快速入门(下)HelloWorld示例详解)两篇的学 ...

  9. RabbitMQ(三):RabbitMQ与Spring Boot简单整合

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.Spring Boot的兴起,极大地简化了Spring的开发,本文将使用Spring Boot与RabbitM ...

随机推荐

  1. wireshark的过滤

    过滤源ip.目的ip.在wireshark的过滤规则框Filter中输入过滤条件.如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8:查找源地址为ip.src= ...

  2. Python 中的垃圾回收机制(转载)

    from: https://foofish.net/python-gc.html GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来 ...

  3. mongodb基础学习11-复制集和分片结合使用

    实际的使用中复制集和分片是结合使用的,即一个分片由一个复制集构成,多个分片存储数据库的数据 调用脚本启动两个复制集 启动configsvr的节点 启动mongos 增加分片,这次要加上复制集的id,节 ...

  4. Linux启动提示Kernel panic - not syncing: Attempted to kill init解决办法

    系统类型:CentOS 6.5(x64) 启动提示:Kernel panic - not syncing: Attempted to kill init 解决办法: 系统启动的时候,按下‘e’键进入g ...

  5. Java中的默认构造函数

    java中如果在一个类中没有写明任何构造函数的,那么会存在一个无参的构造函数,如下: public class Children { private String name; private Stri ...

  6. Haskell语言学习笔记(41)Parsec(1)

    Parsec Parsec是一个词法及语法分析器. 匹配字符与字符串 Prelude Text.Parsec> parseTest anyChar "a" 'a' Prelu ...

  7. Ubuntu 安装 Elasticsearch

    1.安装java 注意:最新版本的elasticsearch(5.6.2)要求安装java8 1.sudo apt-add-repository ppa:webupd8team/java 2.sudo ...

  8. xpath的层级与逻辑定位

    xpath的层级与逻辑定位: 之前我们是通过class和id,name,如果我们所需要的元素没有class,id,name这样的元素,怎么定位呢 1.在不使用xpath情况下:元素没有属性值得时候怎么 ...

  9. css:多个div在同一行显示

    使用float:left,也可以使用display : inline-block,可以使多个div在同一行显示. 示例如下: <div class="search_row"& ...

  10. js:Date格式化

    将Date类型格式化为"yyyy/MM/dd HH:mm:ss" 函数代码如下: //Date的prototype 属性可以向对象添加属性和方法. Date.prototype.F ...