关于用Struts2 拦截器做手机端token的验证,手机端请求服务器端任何接口,都要自动通过拦截器进入自定义拦截类中走一趟,当手机端拿着token进入时 就开始判断 token是否有效,无效的话任何接口调不到,并返回错误代码101。自定义拦截类可根据自己的需求来写
拦截器设置 Struts.xml
<package name="sel" namespace="" extends="json-default">
<!-- <interceptors>
<interceptor name="MyInterceptor" class="自定义的拦截类地址"/>
</interceptors> -->
<interceptors>
<!-- 定义权限控制拦截器 -->
<interceptor name="MyInterceptor"
class="自定义的拦截类地址" />
<!-- 定义一个包含权限控制的拦截器栈 -->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="MyInterceptor" />
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器 -->
<default-interceptor-ref name="mydefault" />
<!-- 设置全局拦截器验证错误输出-->
<global-results>
<result name="error" type="json">
<param name="root">result</param>
</result>
</global-results>
</package>
<!-- 由于是设置了全局拦截 所以其他的包都要集成拦截器的包-->
<package name="selPackage" namespace="" extends="sel">
自定义拦截器类
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.app.xxx.xxx;
import com.app.service.xxxService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
//需实现Interceptor类
public class TokenUtil implements Interceptor{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final String YAN = "XXXXX";// 加盐
@Autowired
private static XXX xxx;
@Autowired
private XxxService xxxServices;
public TokenUtil() {
}
/**
* 产生一个token
*/
public static Token generateToken(String uniq) {
Token token = new Token(MD5.toMD5(System.currentTimeMillis()+YAN+uniq), System.currentTimeMillis());
return token;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("---------destroy()---------");
}
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("---------init()---------");
}
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
ActionContext ctx = ActionContext.getContext();
Map<String, Object> jsonResult = new HashMap<>();
HttpServletRequest request=ServletActionContext.getRequest();
String token = request.getHeader("xxxx");//获取客户端储存的token
try{
if (System.currentTimeMillis() > xxx.getTokentime()) {
//当token失效,将数据库中的token和有效时间替换掉,内容随意填
XXX.update("", -1, "",xxx.id());
//错误返回输出
jsonResult.put("resultCode", "100 ");
ctx.put("result", jsonResult);
return "error";
}else{
String Dbtoken = xxx.getToken();
if (Dbtoken != null && Dbtoken.equals(token)){
//如果通过就放行 return invocation.invoke();
return invocation.invoke();
}else{
jsonResult.put("resultCode", "101");
ctx.put("result", jsonResult);
return "error";
}
}
}catch(NullPointerException e)
{
jsonResult.put("resultCode", "102");
ctx.put("result", jsonResult);
return "error";
}
}
---------------------------------------------------------------------------
get and set
}
我是将 自己生成的token存入数据库中 然后验证