1.建立全局常量类:项目中多处使用到硬编码的状态码和状态描述属性,构建全局常量类替换。 CrmConstants.java
package com.shsxt.crm.base.constants;
/**
* 全局常量
*/
public class CrmConstants {
// 状态编码
public static final Integer OPS_SUCCESS_CODE = 200;
// 状态描述
public static final String OPS_SUCCESS_MESSAGE = "操作成功";
// 状态编码
public static final Integer OPS_FAILED_CODE = 400;
// 状态描述
public static final String OPS_FAILED_MESSAGE = "操作失败";
}
2.全局异常类:GlobalExceptionResolver.java
package com.shsxt.crm.base.exception;
import com.alibaba.fastjson.JSON;
import com.shsxt.crm.base.BaseResult;
import com.shsxt.crm.base.constants.CrmConstants;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 全局异常类
*/
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {
/**
* 异常处理
*
* @param request 请求对象
* @param response 响应对象
* @param handler 请求的目标方法对象 json方法 跳转页面方法
* @param e 异常对象
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception e) {
// 构建默认返回对象
ModelAndView mv = buildModelAndView(request, e);
// 判断是否是系统异常
if (!(handler instanceof HandlerMethod))
return mv;
// 判断请求的方法是json还是跳转页面
// 强转对象类型
HandlerMethod method = (HandlerMethod) handler;
// 获取ResponseBody注解
ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
// json请求
if (null != responseBody) {
BaseResult baseResult = new BaseResult(CrmConstants.OPS_FAILED_CODE,
CrmConstants.OPS_FAILED_MESSAGE);
// 判断是否是参数异常
if (e instanceof ParamsException) {
ParamsException pe = (ParamsException) e;
baseResult.setCode(pe.getCode());
baseResult.setMessage(pe.getMessage());
}
// 设置请求数据头信息
// 初始化 Response 构建JSON对象
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = null;
try {
pw = response.getWriter();
pw.write(JSON.toJSONString(baseResult));
pw.flush();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (null != pw)
pw.close();
}
return null;
} else {
// 跳转页面
// 判断是否是参数异常
if (e instanceof ParamsException) {
ParamsException pe = (ParamsException) e;
mv.addObject("errorMsg", e.getMessage());
}
}
return mv;
}
// 构建默认的返回对象
private ModelAndView buildModelAndView(HttpServletRequest request, Exception e) {
request.setAttribute("ctx", request.getContextPath());
request.setAttribute("uri", request.getRequestURI());
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
mv.addObject("errorMsg", e.getMessage());
return mv;
}
}
3.参数异常类优化
package com.shsxt.crm.base.exception;
import com.shsxt.crm.base.constants.CrmConstants;
/**
* 参数异常
*/
public class ParamsException extends RuntimeException {
private Integer code = CrmConstants.OPS_FAILED_CODE;
private String message = "参数异常";
public ParamsException() {
}
public ParamsException(Integer code, String message) {
super(message);
this.code = code;
this.message = message;
}
public ParamsException(Integer code) {
super("参数异常");
this.code = code;
}
public ParamsException(String message) {
super(message);
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
4.公共返回对象优化
package com.shsxt.crm.base;
import com.shsxt.crm.base.constants.CrmConstants;
import java.io.Serializable;
/**
* 公共返回对象
*/
public class BaseResult implements Serializable {
// 状态编码
private Integer code = CrmConstants.OPS_SUCCESS_CODE;
// 状态描述
private String message = CrmConstants.OPS_SUCCESS_MESSAGE;
// 返回对象
private Object result;
public BaseResult() {
}
public BaseResult(String message) {
this.message = message;
}
public BaseResult(Integer code, String message) {
this.code = code;
this.message = message;
}
public BaseResult(Integer code, Object result) {
this.code = code;
this.result = result;
}
public BaseResult(String message, Object result) {
this.message = message;
this.result = result;
}
public BaseResult(Integer code, String message, Object result) {
this.code = code;
this.message = message;
this.result = result;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
5.控制层代码优化
package com.shsxt.crm.system.controller;
import com.shsxt.crm.base.BaseResult;
import com.shsxt.crm.base.util.Base64Util;
import com.shsxt.crm.base.util.CookieUtil;
import com.shsxt.crm.system.model.UserModel;
import com.shsxt.crm.system.pojo.User;
import com.shsxt.crm.system.service.UserServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
/**
* 用户controller
* Created by Administrator on 2019/8/26.
*/
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserServiceI userServiceI;
/**
* 用户登录
*
* @param request
* @return
*/
@RequestMapping("/login")
@ResponseBody
public BaseResult userLogin(HttpServletRequest request, User user, String rememberMe) {
request.setAttribute("ctx", request.getContextPath());
UserModel userModel = userServiceI.userLogin(user, rememberMe);
//将用户信息存入session
request.getSession().setAttribute("user", userModel);
return new BaseResult("登录成功", userModel);
}
/**
* 安全退出
*
* @param request
* @return
*/
@RequestMapping("/logout")
public String userLogout(HttpServletRequest request) {
request.setAttribute("ctx", request.getContextPath());
//清除session信息
request.getSession().removeAttribute("user");
return "login";
}
@RequestMapping("/updateUserPwd")
@ResponseBody
public BaseResult updateUserPwd(HttpServletRequest request, String oldPassword,
String newPassword, String confirmPassword) {
//从cookie获取用户加密id
String userIdStr = CookieUtil.getCookieValue(request, "userIdStr");
//将获取的加密id解密
Integer id = Integer.valueOf(Base64Util.decoder(userIdStr));
//修改密码
userServiceI.updateUserPwd(id, oldPassword, newPassword, confirmPassword);
return new BaseResult("修改成功");
}
}