一:首先创建一个token处理类  ,这里的类名叫 TokenHandler

private static Logger logger = Logger.getLogger(TokenHandler.class);static Map<String, String> springmvc_token = new HashMap<String, String>();//生成一个唯一值的token@SuppressWarnings("unchecked")public synchronized static String generateGUID(HttpSession session) {String token = "";try {Object obj =  session.getAttribute("SPRINGMVC.TOKEN");if(obj!=null)springmvc_token = (Map<String,String>)session.getAttribute("SPRINGMVC.TOKEN");token = new BigInteger(165, new Random()).toString(36).toUpperCase();springmvc_token.put(Constants.DEFAULT_TOKEN_NAME + "." + token,token);session.setAttribute("SPRINGMVC.TOKEN", springmvc_token);Constants.TOKEN_VALUE = token;} catch (IllegalStateException e) {logger.error("generateGUID() mothod find bug,by token session...");}return token;}//验证表单token值和session中的token值是否一致@SuppressWarnings("unchecked")public static boolean validToken(HttpServletRequest request) {String inputToken = getInputToken(request);if (inputToken == null) {logger.warn("token is not valid!inputToken is NULL");return false;}HttpSession session = request.getSession();Map<String, String> tokenMap = (Map<String, String>)           session.getAttribute("SPRINGMVC.TOKEN");if (tokenMap == null || tokenMap.size() < 1) {logger.warn("token is not valid!sessionToken is NULL");return false;}String sessionToken = tokenMap.get(Constants.DEFAULT_TOKEN_NAME + "."+ inputToken);if (!inputToken.equals(sessionToken)) {logger.warn("token is not valid!inputToken='" + inputToken+ "',sessionToken = '" + sessionToken + "'");return false;}tokenMap.remove(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);session.setAttribute("SPRINGMVC.TOKEN", tokenMap);return true;}//获取表单中token值@SuppressWarnings("unchecked")public static String getInputToken(HttpServletRequest request) {Map params = request.getParameterMap();if (!params.containsKey(Constants.DEFAULT_TOKEN_NAME)) {logger.warn("Could not find token name in params.");return null;}String[] tokens = (String[]) (String[]) params.get(Constants.DEFAULT_TOKEN_NAME);if ((tokens == null) || (tokens.length < 1)) {logger.warn("Got a null or empty token name.");return null;}return tokens[0];}

二: 自己实现一个自定义标签 这里我自定义的标签叫: <dy:token/> 页面中使用如下:

1:引入标签库:<%@ taglib prefix="dy" uri="/dy-tags"%>

2:jsp页面中的表单,注意加上token标签!!!如下:

index.jsp!!!

<%@ taglib prefix="dy" uri="/dy-tags"%>
<html><head><title>spring mvc</title></head><body>       welcome to spring mvc!<br/><form name="mvcForm" action="indexSubmit.do" method="post"><dy:token/>username: <input name="username" type="text" value="${user.username}"/>password: <input name="password" type="text" value="${user.password}"/>email: <input name="email" type="text" value="${user.email}"/><input type="submit" value="提交"></form></body>
</html>

三 :这是我用到的常量:

public static String DEFAULT_TOKEN_MSG_JSP = "unSubmit.jsp" ;
public static String TOKEN_VALUE ;
public static String DEFAULT_TOKEN_NAME = "springMVC.token";

四: 我MyController类的以下2个方法要用到token,防止表单重复提交

@RequestMapping(value = "index.do")public String index(HttpServletRequest request) {return "index";}
@RequestMapping(value = "indexSubmit.do", method = RequestMethod.POST)public String indexSubmit(User user,HttpServletRequest request) {try {myService.insert(user);logger.info("info=新增成功");} catch (Exception e) {logger.error("exception:" + e);}

五:以下是我拦截器的实现,注意有两个拦截器,一个生成token,一个验证token。

/*** @Title* @author dengyang* @date 2013-6-4*/
public class TokenHandlerInterceptor implements HandlerInterceptor{public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {}public void postHandle(HttpServletRequest request, HttpServletResponse response,Object arg2, ModelAndView arg3) throws Exception {TokenHandler.generateGUID(request.getSession());}public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception {return true;}
}
/*** @Title* @author dengyang* @date 2013-6-4*/
public class TokenValidInterceptor implements HandlerInterceptor{public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object arg2, Exception arg3)throws Exception {}public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3) throws Exception {}public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception {if(!TokenHandler.validToken(request)){response.sendRedirect(Constants.DEFAULT_TOKEN_MSG_JSP);return false;}return true;}
}

六:这下面是spring拦截器配置:

<mvc:interceptor><mvc:mapping path="/index.do" />-->这个请求返回的是你有token的页面<bean class="com.dengyang.interceptor.TokenHandlerInterceptor" /></mvc:interceptor><mvc:interceptor><mvc:mapping path="/indexSubmit.do" />-->这个是提交请求<bean class="com.dengyang.interceptor.TokenValidInterceptor" /></mvc:interceptor>