Struts Token 使用 1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。 2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提交的判断。 if (isTokenValid(request, true)) { // 未重复提交时,正确的时候应该做的事情 return mapping.findForward("success"); } else { // 重复提交时,需要做的事情 saveToken(request); return mapping.findForward("error"); } Struts Token 机制: 1, 由第一个Action调用saveToken(HttpServletRequest request),这个方法内部实现如下: protected void saveToken(HttpServletRequest request) { token.saveToken(request); } token.saveToken(request); 这个方法的实现如下: public synchronized void saveToken(HttpServletRequest request) { HttpSession session = request.getSession(); String token = generateToken(request); if (token != null) { session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token); } } 这个方法调用generateToken方法实现如下: public synchronized void saveToken(HttpServletRequest request) { HttpSession session = request.getSession(); String token = generateToken(request); if (token != null) { session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token); } } generateToken完毕后,将得到的唯一值setAttribute到session中。 session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token); Globals.TRANSACTION_TOKEN_KEY的值是:” org.apache.struts.action.TOKEN” 然后跳转到JSP页面。 2, JSP页面的Struts自定义标签 <html:form>的标签类:org.apache.struts.taglib.html. FormTag 这个类的doStartTag()方法会调用本类的renderToken()方法。 protected String renderToken() { StringBuffer results = new StringBuffer(); HttpSession session = pageContext.getSession(); if (session != null) { String token = (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY); if (token != null) { results.append("<input type=/"hidden/" name=/""); results.append(Constants.TOKEN_KEY); results.append("/" value=/""); results.append(token); if (this.isXhtml()) { results.append("/" />"); } else { results.append("/">"); } } } return results.toString(); } 这样子会生成类似于 <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"> 的隐藏标签。 然后提交到一个Action中,在Action中用isTokenValid()方法进行比较session中” org.apache.struts.action.TOKEN”的这个key所对应的值和提交来的request中的” org.apache.struts.action.TOKEN”的这个value是否一致。 如果为true,那么证明可以提交。如果为false,证明已经重复,不允许提交。 本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/shanghui815/archive/2010/09/05/5865092.aspx