Java基于ssm框架的restful应用开发

好几年都没写过java的应用了,这里记录下使用java ssm框架、jwt如何进行rest应用开发,文中会涉及到全局异常拦截处理、jwt校验、token拦截器等内容。

1、jwt工具类

直接贴代码了,主要包括jwt的sign、verify、decode三个方法,具体实现如下:

package com.isoft.util;

import java.util.Date;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT; public class JwtUtil { private static final String SECRET = "xxxxx";
private static final String USERID = "userId";
private static final String ISSUER = "xxxx.com"; // 过期时间7天
private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000; // jwt sign
public static String sign(Integer userId) {
try {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithmHS = Algorithm.HMAC256(SECRET);
return JWT.create().withClaim(USERID, userId).withExpiresAt(date).withIssuer(ISSUER).sign(algorithmHS);
} catch (Exception e) {
return null;
}
} // jwt verify
public static boolean verify(String token, Integer userId) {
try {
Algorithm algorithmHS = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithmHS).withClaim(USERID, userId).withIssuer(ISSUER).build();
verifier.verify(token);
return true;
} catch (Exception e) {
System.out.println(e);
return false;
}
} // 返回token中的用户名
public static Integer getUserId(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim(USERID).asInt();
} catch (Exception e) {
return null;
}
}
}

2、全局异常处理类

ssm中进行rest全局异常拦截处理主要用到RestControllerAdvice型注解类,直接贴代码:

package com.isoft.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice; import com.isoft.po.Response; @RestControllerAdvice
public class ExceptionAdvice { /**
* 400 - Bad Request
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public Response handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
return new Response().failure("could not read json");
} /**
* 405 - Method Not Allowed
*
* @param e
* @return
*/
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Response handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
return new Response().failure("request method not supported");
} /**
* 500 - Internal Server Error
*
* @param e
* @return
*/
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public Response handleException(Exception e) {
System.err.println(e);
return new Response().failure(e.getMessage());
} }

这里主要拦截了405、400、500的n行yi'chang异常情况,可根据具体情况拓展。

3、自定义Response返回类

我们自定义的Response返回类格式如下:

{
"meta": {
"success": true,
"message": "ok"
},
data: Array or Object
}

代码如下:

package com.isoft.po;

public class Response {

	private static final String OK = "ok";
private static final String ERROR = "error"; private Meta meta;
private Object data; public Response success() {
this.meta = new Meta(true, OK);
return this;
} public Response success(Object data) {
this.meta = new Meta(true, OK);
this.data = data;
return this;
} public Response success(Object data, String msg){
this.meta = new Meta(true, msg);
this.data = data;
return this;
} public Response failure() {
this.meta = new Meta(false, ERROR);
return this;
} public Response failure(String message) {
this.meta = new Meta(false, message);
return this;
} public Meta getMeta() {
return meta;
} public Object getData() {
return data;
} public class Meta { private boolean success;
private String message; public Meta(boolean success) {
this.success = success;
} public Meta(boolean success, String message) {
this.success = success;
this.message = message;
} public boolean isSuccess() {
return success;
} public String getMessage() {
return message;
}
}
}

4、jwt的token拦截器Interceptor

spring mvc的Interceptor实现类一般是继承HandlerInterceptor接口并重写preHandle、postHandle、afterCompletion的方法来实现的,这里我们直接进行token的verify返回即可,具体代码如下:

package com.isoft.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import com.isoft.util.JwtUtil;
import com.isoft.util.StringUtil; /**
* jwt token拦截
* @author sd
*
*/
public class TokenInterceptor implements HandlerInterceptor{ @Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub } @Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub } @Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
String token = req.getHeader("Authorization");
if (StringUtil.isEmpty(token)) {
return false;
}
token = token.replace("Bearer ", "");
boolean isPass = JwtUtil.verify(token, JwtUtil.getUserId(token));
if (isPass) {
return true;
}
res.setStatus(401);
return false;
} }

写完这些还不行,需要将拦截器注册到spring-mvc的config中:

<!-- mvc拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/users/login"/>
<bean class="com.isoft.interceptor.TokenInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

这里使用mvc:exclude-mapping可以直接排除某个接口的拦截,比较方便。

5、mysql插入中文乱码解决

使用ssm框架mybatis进行数据插入时,发现插入中文进去后数据有乱码情况,除了设置数据库编码之外还解决不了问题的话,不妨看下mybatis的链接编码设置,如果是db.properties的话,使用如下设置:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8
jdbc.username=username
jdbc.password=password

6、一个简单的rest controller实例

package com.isoft.web.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController; import com.isoft.po.PageBean;
import com.isoft.po.Response;
import com.isoft.po.User;
import com.isoft.service.UserService;
import com.isoft.util.JwtUtil;
import com.isoft.util.StringUtil; /**
* 用户控制器类
*/ @RequestMapping("/users")
@RestController
public class UserController { @Resource
private UserService userService; /**
* 用户注册
*
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping(value = "/", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.CREATED)
public Response save(@RequestBody User user, HttpServletResponse res) throws Exception {
userService.add(user);
return new Response().success(user);
} /**
* 用户登录
*
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping(value = "login", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public Response login(@RequestBody User user, HttpServletResponse res) throws Exception {
System.out.println(user);
User u = userService.login(user);
if (u != null) {
String token = JwtUtil.sign(u.getId());
u.setToken(token);
u.setHashedPassword("");
return new Response().success(u, "login success");
}
return new Response().failure("username or password wrong");
} /**
* 用户查询带分页
*
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
@ResponseStatus(value = HttpStatus.OK)
public Response list(@RequestParam(value = "page", required = false, defaultValue = "1") String page,
@RequestParam(value = "rows", required = false, defaultValue = "10") String rows, User s_user, HttpServletResponse res)
throws Exception {
System.out.println(s_user);
PageBean pageBean = new PageBean(Integer.parseInt(page), Integer.parseInt(rows));
Map<String, Object> map = new HashMap<String, Object>();
map.put("userName", StringUtil.formatLike(s_user.getUserName()));
map.put("email", s_user.getemail());
map.put("start", pageBean.getStart());
map.put("size", pageBean.getPageSize());
List<User> userList = userService.find(map);
return new Response().success(userList);
} /**
* 用户更新
*
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@ResponseStatus(value = HttpStatus.OK)
public Response update(@PathVariable Integer id, @RequestBody User user, HttpServletResponse res) throws Exception {
user.setId(id);
System.out.println(user);
Integer count = userService.update(user);
if (count != 0) {
return new Response().success();
}
return new Response().failure();
} /**
* 用户删除,支持批量
* @param id
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
@ResponseStatus(value = HttpStatus.OK)
public Response delete(@PathVariable String ids, HttpServletResponse res) throws Exception {
String[] idsStrings = ids.split(",");
for (String id : idsStrings) {
userService.delete(Integer.parseInt(id));
}
return new Response().success();
} /**
* 用户详情
* @param id
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseStatus(value = HttpStatus.OK)
public Response getUser(@PathVariable Integer id, HttpServletResponse res) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
List<User> users = userService.find(map);
return new Response().success(users);
}
}

Java基于ssm框架的restful应用开发的更多相关文章

  1. 一款基于SSM框架技术的全栈Java web项目(已部署可直接体验)

    概述 此项目基于SSM框架技术的Java Web项目,是全栈项目,涉及前端.后端.插件.上线部署等各个板块,项目所有的代码都是自己编码所得,每一步.部分都有清晰的注释,完全不用担心代码混乱,可以轻松. ...

  2. 基于SSM框架的JavaWeb通用权限管理系统

    - - ->关注博主公众号[C you again],获取更多IT资源(IT技术文章,毕业设计.课程设计系统源码,经典游戏源码,HTML网页模板,PPT.简历模板,!!还可以投稿赚钱!!,点击查 ...

  3. 文献综述七:基于SSM的网上商城的开发与设计

    一.基本信息 标题:基于SSM的网上商城的开发与设计 时间:2018 出版源:Computer Knowledge and Technology 文件分类:对框架的研究 二.研究背景 为了解决现在电商 ...

  4. Java基于SSM在线学习系统设计与实现

                 Spring+SpringMVC+MyBatis+Bootstrap+Vue开发在线学习系统 本课题的主要内容是开发基于Java EE的在线学习平台,使用MVC经典开发模式. ...

  5. 基于SSM框架贺州学院校园二手交易平台设计与实现

    前言 这个是我当时的毕业论文,分享出来,给同学们参考. 绪论 随着中国新四大发明的诞生,网购成了千千万万网友们购物的新方式,新的购物方式促进商业的发展,但随着人们生活水平的提高,许多新购置的物品用了没 ...

  6. JAVA:ssm框架搭建

    文章来源:http://www.cnblogs.com/hello-tl/p/8328071.html 环境简介 : jdk1.7.0_25/jdk1.8.0_31  tomcat-7.0.81  m ...

  7. spring boot 简介(基于SSM框架的一个升级版本吧)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  8. 基于SSM框架配置多数据源

    项目基于ssm + maven,通过注解可以实现自动切换数据源. 一.pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  9. pageoffice实现网页打开编辑保存word文档(基于SSM框架)

    pageoffice是一款网页集成word.excel...等office工具 并不免费,但可以试用练习 SSM框架搭建过程就省略了 注意:由于谷歌/火狐升级,不支持插件嵌入,建议使用POBrowse ...

随机推荐

  1. VS2017集成FastReport.Net并将模板保存到数据库

    本着开发与实施分离的思想,设计一个通用的报表设计窗体显得尤为重要(下图为图一): 要求与优点: I.报表设计窗体支持所有单据调用,一种单据支持多个打印模板. II.报表模板存储在数据库中.一是支持客户 ...

  2. jzoj4724

    DJL为了避免成为一只咸鱼,来找czgj学习Fibonacci数列. 通过czgj的谆谆教导,DJL明白了Fibonacci数列是这样定义的: F(1)=1;F(2)=1;F(n)=F(n-1)+F( ...

  3. SAX,功能强大的 API

    https://www.ibm.com/developerworks/cn/xml/x-saxapi/ SAX,功能强大的 API 在摘自 XML by Example 的本篇预览中比较了 DOM 和 ...

  4. Chrome谷歌浏览器已停用不支持的扩展程序解决方法

    在不能上外网的情况下解决该问题: http://www.liu16.com/post/Chrome_2447.html

  5. HTML 5 使用 FileReader、FormData实现文件上传

    一.FileReader FileReader 对象允许Web应用程序异步读取存储在用户计算机中的文件(或缓冲区的原始数据),使用File或Blob对象指定要读取的文件或数据. 1.1 实例化 var ...

  6. 【hdu6035】 Colorful Tree dfs序

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题目大意:给你一棵树,树上每个节点都有一个颜色. 现在定义两点间的距离为两点最短路径上颜色集合 ...

  7. easyui 中iframe嵌套页面,大弹窗自适应居中的解决方法。$('#win').window()

    easyui 中iframe嵌套页面,大弹窗自适应居中的解决方法.$('#win').window() 以下是左边栏和头部外层遮罩显示和隐藏方法 /*外层 遮罩显示*/ function wrapMa ...

  8. 原生js 实现jquery addClass,removeClass

    代码如下: function hasClass(obj, cls) { let reg = new RegExp("(\\s|^)" + cls + "(\\s|$)&q ...

  9. django框架--底层架构

    目录 零.参考 一.对于web服务的理解 二.对于wsgi协议的理解 三.自定义一个简单的基于wsgi协议的web框架 四.django中的server实现 五.django中的application ...

  10. C++的开源跨平台日志库glog学习研究(一)

    作为C++领域中为数不多的好用.高效的.跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了.glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作. 恰巧趁着五一我也 ...