现在开发流行使用VUE做前端,通过前后端分离的方式来架构系统。那么为什么要前后端分离呢?
首先,前后端分离是团队合作的产物,团队任务分工后,前端工程师专注前端业务展现,后端工程师专注业务逻辑。
其次,前后端分离有利于系统大流量的并发处理。分离后,前端通常会采取CDN加速,以达到快速展现的目标,同时减轻了网络带宽和服务器的压力。
由于本人在VUE上的造诣一般,这里就不多讲VUE,只是用来做一些显示和验证后端。
需要学习VUE的给你个传送门https://www.runoob.com/vue2/vue-tutorial.html
认证阅读几遍应该就没有什么问题,毕竟javascript的语法和java还是比较相似的。
首先,创建一个生产Token的类TokenGenerator
package com.james.framework.modules.sys.oauth2;
import com.james.framework.common.exception.RRException;
import java.security.MessageDigest;
import java.util.UUID;
public class TokenGenerator {
public static String generateValue() {
return generateValue(UUID.randomUUID().toString());
}
private static final char[] hexCode = "0123456789abcdef".toCharArray();
public static String toHexString(byte[] data) {
if(data == null) {
return null;
}
StringBuilder r = new StringBuilder(data.length*2);
for ( byte b : data) {
r.append(hexCode[(b >> 4) & 0xF]);
r.append(hexCode[(b & 0xF)]);
}
return r.toString();
}
/**
* token生产方法,采用MD5加密
* @param param
* @return
*/
public static String generateValue(String param) {
try {
MessageDigest algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(param.getBytes());
byte[] messageDigest = algorithm.digest();
return toHexString(messageDigest);
} catch (Exception e) {
throw new RRException("生成Token失败", e);
}
}
}
此处主要方法generateValue,通过对UUID进行MD5加密后,再做一次Hex处理。功能不复杂具体看代码。
然后,创建一个过滤器,拦截所有请求,检查header中是否携带token,没有token返回401,具体看OAuth2Filter代码。
package com.james.framework.modules.sys.oauth2;
import com.google.gson.Gson;
import com.james.framework.common.utils.Rest;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class OAuth2Filter extends AuthenticatingFilter {
@Override
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
//获取请求token
String token = getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
return null;
}
return new OAuth2Token(token);
}
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
return false;
}
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//获取请求token,如果token不存在,直接返回401
String token = getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
HttpServletResponse httpResponse = (HttpServletResponse) response;
String json = new Gson().toJson(Rest.error(401, "invalid token"));
httpResponse.getWriter().print(json);
return false;
}
return ex